【问题标题】:regex lookbehind followed by lookahead正则表达式先行后视
【发布时间】:2013-07-12 05:17:32
【问题描述】:

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

期望的结果: allshortsofCharactersExceptDoubleQuotes

*&^%$blahblah

使用 c# .NET:

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

产量: allshortsofCharactersExceptDoubleQuotes",start2="*&^%$blahblah

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

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

回复中的正确答案(据我测试):

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

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

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

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

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

【问题讨论】:

    标签: c# regex lookahead


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。将再次尝试 Linq。没有测试出来
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 第一个不会匹配任何内容,因为您缺少"..第二个结果将包括第一个"
    • 请参阅stackoverflow.com/questions/1928909/… 双引号被字符串中的额外双引号转义
    • 谢谢!这两个都有效。我完全沉浸在前瞻中,看不到明显的东西:)
    【解决方案3】:

    你可以用这个:

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

    结果就是整个模式。

    【讨论】:

    • @Anirudh:是和否,因为这会检查后面是否有双引号。想象一下这个字符串:abcd start2="abcd,我该怎么办?
    • 谢谢。是的 (?="") 是多余的,但这是我要求的,并证明如果需要可以使用前瞻。
    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多