【问题标题】:How to match all words but one?如何匹配除一个以外的所有单词?
【发布时间】:2012-06-25 13:17:10
【问题描述】:

我正在尝试匹配以 PRE 开头并以 PRE 结尾的表达式。我正在寻找一个惰性匹配,即匹配表达式中的结尾 PRE 应该是在起始 PRE 之后找到的第一个。 我试图通过负前瞻正则表达式来实现这一点,在 RegExr 上进行测试:

正则表达式:

PRE(\w|\s)+(?!PRE)

要匹配的表达式:

PRE erp PRE edas PRE

上面的表达式完全匹配给定的正则表达式,而我原本期望只匹配 PRE erp PRE。 请建议一个延迟匹配以 PRE 开头和结尾的表达式的正则表达式。

【问题讨论】:

  • 这应该返回多少匹配? 2?
  • 大小写重要吗?也就是说,prepRe(例如)是否会被视为分隔符?

标签: java regex negative-lookahead


【解决方案1】:

这应该可以完成工作:

(?<=PRE)(.+?)(?=PRE)

http://regexr.com?31bc5

【讨论】:

    【解决方案2】:
    "(PRE)(.*?)(PRE)" 
    

    这适用于我的 (C#) 代码,返回一个匹配项 PRE erp PRE。

            var codeBlocks = Regex.Matches("PRE erp PRE edas PRE", "(PRE)(.*?)(PRE)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
            MessageBox.Show("Matches found: " + codeBlocks.Count.ToString() + "\nMatch: " + codeBlocks[0].Value);
    

    【讨论】:

    • 你应该离开 ignorecase 标志
    【解决方案3】:

    假设你的语言支持惰性匹配(如果它支持环视,我想它也支持惰性量词):

    PRE(.*?)PRE
    

    由于此答案可能有误,请下次指定您的语言。正则表达式针对不同的语言有不同的功能集。

    【讨论】:

    • 我也是这么想的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多