正则表达式匹配包含单词但本身不包含单词的字符串

Regex Match String Containing Word but not Word on its own

我正在尝试创建一个正则表达式来匹配任何字符串,包括包含 "hello" 的字符串,但不匹配 "hello" 本身。

例如:

"hello1" - matches

"say hello" - matches

"hello there" - matches

"goodbye" - matches

"hello" - doesn't match

以下表达式将匹配所有不包含 "hello" 的内容,但我想不出符合要求的表达式。

^((?!hello).)*$

不幸的是,它们不能是与此相关的额外逻辑。我正在寻找与上述字符串匹配的单个表达式。

谢谢!

^(?:((?!hello).)*|.+hello.*|.*hello.+)$

采用您的原始正则表达式并添加替代项 (|) 至:

  • .+hello.* - 在 hello
  • 出现之前至少有一个字符
  • .*hello.+ - 在 hello
  • 出现后至少有一个字符


另一种解决方案是仅检查前瞻本身中字符串结尾的存在:

^(?!hello$).*$

就其价值而言,先检查可能更高效,因为简单的字符串匹配相当快。在 PHP:

if($string != 'hello' && preg_match('/hello/', $string)) {
    // String contains hello, but is not only hello
}

或者你甚至不必看,如果字符串是你要查找的单词的长度,因为如果它匹配,它只会是那个单词:

if(strlen($string) > 5 && preg_match('/hello/i', $string)) { }

现在,如果你想考虑空格,或者只是重复那个词,那就是另一回事了。

我认为 中的 (.+hello.*|.*hello.+) 就足够了。