正则表达式匹配字符串包含Word而不是Word本身

时间:2016-01-12 22:59:00

标签: regex regex-negation regex-lookarounds

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

例如:

"hello1" - matches

"say hello" - matches

"hello there" - matches

"goodbye" - matches

"hello" - doesn't match

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

^((?!hello).)*$

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

谢谢!

3 个答案:

答案 0 :(得分:0)

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

使用原始正则表达式并添加替代方法(|):

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

<小时/> 另一种解决方案是只检查先行本身中字符串结尾的存在:

^(?!hello$).*$

答案 1 :(得分:0)

对于它的价值,首先检查可能更有效,因为简单的字符串匹配相当快。在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)) { }

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

答案 2 :(得分:0)

我认为来自ndn's(.+hello.*|.*hello.+)就足够了。