如何匹配不包含某些子字符串的字符串组

时间:2012-03-06 17:13:52

标签: php javascript regex pcre

我必须匹配包含“__”字符序列(两个下划线)的字符串组

例如:

hello __1the_re__ my name is __pe er33__

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

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

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

我试过这个,但它没有用......

谢谢你!

3 个答案:

答案 0 :(得分:3)

你很亲密:

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

的工作原理。星星必须在重复组之外,因此在每个位置执行前瞻,而不是在前导__之后。

由于这不能捕获正确的文本(我猜你想要捕获双下划线之间的内容),你可能想要

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

答案 1 :(得分:1)

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

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

    正则表达式:

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

    首先匹配,它继续。要获得更好的匹配提取,请添加非捕获标记并匹配内部:

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

    示例:

    $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
    )
    

    但显然让量词变得更加容易:

    /__(.+?)__/
    

答案 2 :(得分:0)

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

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