我必须匹配包含“__”字符序列(两个下划线)的字符串组
例如:
hello __1the_re__ my name is __pe er33__
“1the_re”和“pe er33”应匹配
我的问题是定义“一个不包含字符序列的字符串”
/__((?!__).*)__/
我试过这个,但它没有用......
谢谢你!答案 0 :(得分:3)
你很亲密:
/__((?!__).)*__/
的工作原理。星星必须在重复组之外,因此在每个位置执行前瞻,而不是在前导__
之后。
由于这不能捕获正确的文本(我猜你想要捕获双下划线之间的内容),你可能想要
/__((?:(?!__).)*)__/
答案 1 :(得分:1)
在分组中,您希望匹配以下内容之一:
_
的字符。_
正则表达式:
/__(.[^_]|[^_])*__/
首先匹配,它继续。要获得更好的匹配提取,请添加非捕获标记并匹配内部:
/__((?:.[^_]|[^_])*)__/
示例:
$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__"]