使否定先行不区分大小写

Make a negative lookahead case-insensitive

我有以下表达式:

$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”。现已修复。

您的第一个正则表达式 ^(?!.*?that).*$ 与区分大小写无关,因为您没有使用任何修饰符来区分大小写。

正则表达式匹配第一句和第三句,因为你的正则表达式表示不应该是一个词that此处区分大小写) 在句子中,这对于第一句和第三句是正确的(在第三句中你有 THATthat 不同)

只匹配首句,可以使用内联修饰符(?i) like

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

here

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

你很接近:

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

参见a demo on regex101.com。在您的表达式 ((?-i)) 中,您正在关闭修饰符 .