我想测试字符串是否包含"Kansas"后跟" State"以外的任何内容。
示例:

"I am from Kansas"          true
"Kansas State is great"     false
"Kansas is a state"         true
"Kansas Kansas State"       true
"Kansas State vs Kansas"    true
"I'm from Kansas State"     false
"KansasState"               true

对于PCRE,我认为答案是:
'Kansas(?! State)'

但mysql的regexp似乎并不喜欢这样。
附录:感谢David M概括了这个问题:
How to convert a PCRE to a POSIX RE?

最佳答案

比那个大的regex(当然,取决于您的数据和引擎的质量)更有效的是

WHERE col LIKE '%Kansas%' AND
  (col NOT LIKE '%Kansas State%' OR
  REPLACE(col, 'Kansas State', '') LIKE '%Kansas%')

不过,如果堪萨斯州通常以“堪萨斯州”的形式出现,您可能会发现这一点更好:
WHERE col LIKE '%Kansas%' AND
  REPLACE(col, 'Kansas State', '') LIKE '%Kansas%'

这样做的另一个优点是更容易维护。如果堪萨斯州很常见,文本字段很大,那么它的工作效果就不太好。当然,你可以在自己的数据上测试这些,并告诉我们它们是如何比较的。

09-25 21:29