【发布时间】:2012-03-24 05:11:41
【问题描述】:
我必须匹配以“__”字符序列(两个下划线)为边界的字符串组
例如:
hello __1the_re__ my name is __pe er33__
“1the_re”和“pe er33”应该匹配
我的问题是定义“一个不包含字符序列的字符串”
/__((?!__).*)__/
这个我试过了,还是不行……
谢谢!
【问题讨论】:
标签: php javascript regex pcre
我必须匹配以“__”字符序列(两个下划线)为边界的字符串组
例如:
hello __1the_re__ my name is __pe er33__
“1the_re”和“pe er33”应该匹配
我的问题是定义“一个不包含字符序列的字符串”
/__((?!__).*)__/
这个我试过了,还是不行……
谢谢!
【问题讨论】:
标签: php javascript regex pcre
你已经接近了:
/__((?!__).)*__/
有效。星号必须在重复组之外,以便在每个位置执行前瞻,而不是紧跟在前导 __ 之后。
由于这没有捕获正确的文本(我猜您希望捕获双下划线之间的内容),您可能想要
/__((?:(?!__).)*)__/
【讨论】:
在您的分组中,您希望匹配以下内容之一:
_ 的字符。_的字符
正则表达式:
/__(.[^_]|[^_])*__/
因为第一个匹配首先,它继续。为了更好的匹配提取,添加非捕获标志并匹配内部:
/__((?:.[^_]|[^_])*)__/
例子:
$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
)
但显然让量词变得懒惰要容易得多:
/__(.+?)__/
【讨论】:
您可以使用非贪婪标记:“?”。
/__((?!__).*?)__/g
// javascript:
>>> "hello __1the_re__ my name is __pe er33__".match(/__((?!__).*?)__/g)
["__1the_re__", "__pe er33__"]
【讨论】: