匹配任何不是加号的字符

Matching any characters that's not a plus sign

我正在尝试使用正则表达式来匹配单词 'begin' 和 'end' 之间不是“+”的任何字符,但由于某种原因它不匹配。我做错了什么?

$content = "begin+text1+end begin text2 end";
$regex = "~begin(^\++?)end~";
preg_match_all($regex, $content, $matches);

print_r($matches);

结果:

Array ( [0] => Array ( ) [1] => Array ( ) )

预期结果:

Array ( [0] => Array ( begin text2 end ) [1] => Array ( text2 ) )

您需要将锚点 ^ 放在字符 class 中以创建否定字符 class:

"~begin([^+]+)end~"

如果稍微改变模式,您应该会得到预期的结果:

(?=[^\s\d]+)begin([^+\n]+)end

此模式使用正向先行 - 断言 space 或数字将在单词 begin 之前反向匹配。捕获组然后抓取那个和 end 之间不包含 + 或换行符 \n.

的任何内容

结果:

Array ([0] => begin text2 end)[1] => Array([0] =>  text2))

示例:

https://regex101.com/r/qS6iL1/2