0

输入:garbage="stff",start1="allshortsofCharactersExceptDoubleQuotes",start2="*&^%$blahblah"

期望的结果:除双引号外的所有字符的缩写

*&^%$blahblah

使用 c# .NET:

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

结果:allshortsofCharactersExceptDoubleQuotes",start2="*&^%$blahblah

通过测试,我知道如果我将 .* 替换为包含除双引号之外的所有字符的集合,我会得到想要的结果,但这是很多工作,我会弄错。在 .* 之前使用 (?!"") 或 (?!="") 也不起作用。

那么如何让先行在它找到的第一个双引号上停止呢?

来自响应的正确答案(据我测试):

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

或者

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

或者这也有效,但并不完全符合要求。

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

谢谢。我对这个项目的前瞻性方面非常着迷。

4

3 回答 3

1

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

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

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

List<string> output=Regex.Matches(input,regex)
                         .Cast<Match>()
                         .Select(x=>x.Value)
                         .ToList();
于 2013-07-12T05:34:44.920 回答
0

你可以使用这个:

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

结果是整个模式。

于 2013-07-12T05:40:55.277 回答
0

您的正则表达式的问题是 .* 匹配的文本太多。您可以通过在星号后添加问号(如 '.*?')来使正则表达式变得懒惰。或者您可以更改它以匹配除双引号之外的所有内容:'[^"]*'在这种情况下,我会选择它。以下应该工作。未测试

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

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

string myRegExString = @"(?<=start[0-9].).*?(?="")"
于 2013-07-12T05:35:08.890 回答