【问题标题】:how to match groups of strings that don't contain some substring如何匹配不包含某些子字符串的字符串组
【发布时间】:2012-03-24 05:11:41
【问题描述】:

我必须匹配以“__”字符序列(两个下划线)为边界的字符串组

例如:

hello __1the_re__ my name is __pe er33__

“1the_re”和“pe er33”应该匹配

我的问题是定义“一个不包含字符序列的字符串”

/__((?!__).*)__/

这个我试过了,还是不行……

谢谢!

【问题讨论】:

    标签: php javascript regex pcre


    【解决方案1】:

    你已经接近了:

    /__((?!__).)*__/
    

    有效。星号必须在重复组之外,以便在每个位置执行前瞻,而不是紧跟在前导 __ 之后。

    由于这没有捕获正确的文本(我猜您希望捕获双下划线之间的内容),您可能想要

    /__((?:(?!__).)*)__/
    

    【讨论】:

    • 不错!好的,现在我明白我的正则表达式出了什么问题,谢谢!
    【解决方案2】:

    在您的分组中,您希望匹配以下内容之一:

    1. 任何字符后跟任何不是_ 的字符。
    2. 任何不是_的字符

    正则表达式:

      /__(.[^_]|[^_])*__/
    

    因为第一个匹配首先,它继续。为了更好的匹配提取,添加非捕获标志并匹配内部:

     /__((?:.[^_]|[^_])*)__/
    

    例子:

    $subject = 'hello __1the_re__ my name is __pe er33__';
    $pattern = '/__((?:.[^_]|[^_])*)__/';
    $r = preg_match_all($pattern, $subject, $match);
    print_r($match[1]);
    

    输出:

    Array
    (
        [0] => 1the_re
        [1] => pe er33
    )
    

    但显然让量词变得懒惰要容易得多:

    /__(.+?)__/
    

    【讨论】:

      【解决方案3】:

      您可以使用非贪婪标记:“?”。

      /__((?!__).*?)__/g
      // javascript:
      >>> "hello __1the_re__ my name is __pe er33__".match(/__((?!__).*?)__/g)
      ["__1the_re__", "__pe er33__"]
      

      【讨论】:

      • 这没有多大意义——如果你让量词变得懒惰,你就不需要前瞻断言。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 2022-01-18
      • 2020-05-01
      相关资源
      最近更新 更多