正则表达式看后面跟着前瞻

时间:2013-07-12 05:17:33

标签: c# regex lookahead

INPUT: 垃圾= “stff”,启动1 = “allshortsofCharactersExceptDoubleQuotes”,START2 = “*&安培; ^%$ blahblah”

期望的结果: allshortsofCharactersExceptDoubleQuotes

*&安培; ^%$ blahblah

使用c#.NET:

string myRegExString = @"(?<=start[0-9].).*(?="")"

Yeilds: allshortsofCharactersExceptDoubleQuotes “START2 =” *&安培; ^%$ blahblah

通过测试,我知道如果我用一个除了双引号之外的所有字符的集合替换。*我会得到所需的结果,但这是很多工作,我会弄错。在。*之前也使用(?!“”)或(?!=“”)也不起作用。

那么如何让前瞻停在它找到的第一个双引号上?

从答复中纠正答案(据我测试):

(?<=start\d+="")[^""]*(?="")

OR

(?<=start\d+="")[^""]+(?="")

或者这也有效,但并不是所要求的。

(?<=start\d+="")[^""]*

感谢。我对这个项目的前瞻方面非常感兴趣。

3 个答案:

答案 0 :(得分:1)

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

(?<=start\d+="").*?(?="")

您可以使用此代码获取此类值的列表

List<string> output=Regex.Matches(input,regex)
                         .Cast<Match>()
                         .Select(x=>x.Value)
                         .ToList();

答案 1 :(得分:0)

正则表达式的问题是。*匹配太多文本。你可以通过在明星之后添加问号来使你的正则表达式变得懒惰,比如'。*?'或者你可以改变它以匹配除了双重quoutes之外的所有东西:'[^"]*'这是我在这种情况下选择的。以下应该有效。未经测试

string myRegExString = @"(?<=start[0-9].)[^""]*(?="")"

我建议的另一个解决方案是:

string myRegExString = @"(?<=start[0-9].).*?(?="")"

答案 2 :(得分:0)

您可以使用:

@"(?<=start\d="")[^""]+(?="")"

结果是整个模式。