为什么带有前瞻的正则表达式不匹配?



我需要(在PHP中(用不能是句子中第一个或最后一个的单词来分隔句子。说这个词是"pressure";这是我的正则表达式

/^.+?(?=[s.,:;])pression(?=[s.,:;]).+$/i

住在这里:https://regex101.com/r/CHAhKj/1/

首先,它不匹配。下一步,我想——有可能这样分开吗?我尝试了简化的示例

print_r(preg_split('/^.+pizza.+$/', 'my pizza is cool'));

住在这里http://sandbox.onlinephpfunctions.com/code/10b674900fc1ef44ec79bfaf80e83fe1f4248d02

它打印了一个由2个空字符串组成的数组['my ', ' is cool']

我需要(在PHP中(用不能是句子中第一个或最后一个的单词来分隔句子

您可以使用以下正则表达式:

(?<=[^s.?]h)pression(?=h[^s.?])

RegEx演示

RegEx详细信息:

  • (?<=[^s.?]h):Lookbacking断言,在当前位置之前,我们有一个空格和一个字符,而不是空白,不是点,也不是?
  • pression:匹配词pression
  • (?=h[^s.?]):向前看,断言在当前位置之前,我们有一个空格和一个字符,而不是空白,不是点,也不是?

首先,^.+?(?=[s.,:;])pression(?=[s.,:;]).+$根本无法匹配任何字符串,因为(?=[s.,:;])p部分要求p也是空白字符,或者是.,:;,这会立即使整个匹配无效。

其次,^.+pizza.+$模式不能确保匹配的pizza不是句子中的第一个或最后一个单词,因为.也匹配空白。它不返回任何有意义的内容,因为preg_split使用匹配将字符串分解为块,并且两个空值是1(字符串的开头和2(空字符串位置。

也就是说,你只需要:

preg_match('~^(.*?wW+)pression(W+w.*)$~is', $text, $m)

请参阅regex演示。详细信息:

  • ^-字符串的开头
  • (.*?wW+)-捕获组1:任何零个或多个字符,尽可能少,然后是一个单词字符,然后是两个或更多个非单词字符
  • pression-一个词
  • (W+w.*)-捕获组2:一个或多个非单词字符,一个单词字符,然后是尽可能多的任何零个或多的字符
  • $—字符串结束

s使.跨行匹配,i标志使模式以不区分大小写的方式匹配。

请参阅PHP演示:

$text = "You can use any regular expression pression inside the lookahead ";
if (preg_match('~^(.*?wW+)pression(W+w.*)$~is', $text, $m)) {
echo $m[1] . " << | >> " . $m[2];
}
// => You can use any regular expression  << | >>  inside the lookahead 

相关内容

  • 没有找到相关文章

最新更新