regex lookbehind followed by lookahead
本文关键字:lookahead by followed lookbehind regex | 更新日期: 2023-09-27 18:22:13
输入:垃圾="stff",start1="allshortsofCharactersExceptDoubleQuotes",start2="*&^%$blahlah"
所需结果:所有字符的缩写除了双引号
*&^%$等等
使用c#.NET:
string myRegExString = @"(?<=start[0-9].).*(?="")"
Yeilds:allshortsofCharactersExceptDoubleQuotes",start2="*&^%$等等
通过测试,我知道如果我把.*替换成一个集,这个集除了双引号外,所有字符都有,我会得到想要的结果,但这是一项艰巨的工作,我会错的。在.*之前同时使用(?!")或(?!=")也不起作用。
那么,我如何让前瞻停止在它找到的第一个双引号上呢?
回答中的正确答案(就我所测试的而言):
(?<=start'd+="")[^""]*(?="")
或
(?<=start'd+="")[^""]+(?="")
或者这也有效,但并不是要求的那样。
(?<=start'd+="")[^""]*
谢谢。我被这个项目的前瞻性所吸引。
您应该使用尽可能少匹配的惰性量词.*?
。。在您的情况下,.*
将尽可能匹配,因此它将捕获到最后一个"
(?<=start'd+="").*?(?="")
你可以使用这个代码得到这样一个值的列表
List<string> output=Regex.Matches(input,regex)
.Cast<Match>()
.Select(x=>x.Value)
.ToList();
正则表达式的问题是.*匹配的文本太多。你可以在星号后面加一个问号,比如".*?"或者,您可以将其更改为将除双quoutes之外的所有内容都匹配为:'[^"]*'
,这是我在这种情况下会选择的。以下内容应该有效。未测试
string myRegExString = @"(?<=start[0-9].)[^""]*(?="")"
我建议的另一个解决方案是:
string myRegExString = @"(?<=start[0-9].).*?(?="")"
您可以使用这个:
@"(?<=start'd="")[^""]+(?="")"
结果就是整个模式。