使负向前瞻不区分大小写

4

我有以下表达式:

$exp = "/^(?!.*?that).*$/";

这里需要匹配任何不包含“that”的行。

我有以下三个句子:

$str = array(   
   "I like this sentence.", #line1
   "I like that sentence.", #line2
   "I link THAT sentence."  #line3
);

匹配区分大小写,因此只有第1行和第3行匹配。目前为止还不错。

然而,我希望它是不区分大小写的,这样它只匹配第1行。我尝试使用内联修饰符"(?-i ... )":

$exp = "/^(?!.*?(?i:that)).*$/";

作为一个标志,即"/.../i":
$exp = "/^(?!.*?that).*$/i";

但是没有任何效果。

我使用以下循环运行搜索:

foreach($str as $s) {
    preg_match_all($exp, $s, $matches); 
    var_dump($matches);
}

输出结果:

array (size=1)
  0 => 
    array (size=1)
      0 => string 'I like this sentence.' (length=21)
array (size=1)
  0 => 
    array (size=0)
      empty
array (size=1)
  0 => 
    array (size=1)
      0 => string 'I link THAT sentence.' (length=21)

这里提供一个在线演示:https://regex101.com/r/bs9rzF/1

我很感激任何有关如何使我的正则表达式不区分大小写的提示。

编辑: 我错误地使用了"?-i"而不是"?i",正如一些贡献者正确指出的那样。现已更正。


1
$exp = "/^(?!.*?that).*$/i"; is correct and should work. However (?-i:... switches off the i modifier. To switch it on: (?i:... - Casimir et Hippolyte
1
你第二次尝试使用 $exp = "/^(?!.*?that).*$/i"; 应该能够工作。 应该能够工作。 - revo
实际上,导致搜索不受 i 修饰符影响而区分大小写的问题似乎是在其他地方:对于带有重音和其他字母表的语言,也需要使用 u 标志,即 "/^(?!.*?that).*$/ui"。感谢您的快速回答! - msoutopico
2个回答

3
你的第一个正则表达式^(?!.*?that).*$与大小写无关,因为你没有使用任何修改器来忽略大小写。
该正则表达式匹配第一和第三个句子,因为它的含义是句子中不应该有单词that(这里区分大小写),这对于第一和第三个句子是正确的(在第三个句子中,你有一个THAT,它与that不同)。
要仅匹配第一个句子,可以使用内联修饰符(?i),如下:
(?i)^(?!.*?that).*$

请看这里
顺便说一句,你的/^(?!.*?that).*$/i正则表达式也是正确的。

2

你差不多就对了:

^(?!.*?(?i)that).*$

请参见regex101.com上的演示。在您的表达式中((?-i)),您已经关闭了修饰符

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接