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+="")[^""]*

谢谢。我被这个项目的前瞻性所吸引。

regex lookbehind followed by lookahead

您应该使用尽可能少匹配的惰性量词.*?。。在您的情况下,.*将尽可能匹配,因此它将捕获到最后一个"

(?<=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="")[^""]+(?="")"

结果就是整个模式。