0

晚上,

我想在 MySQL 表中的某些列中搜索 [az]\.[az] 的任何实例,例如:

John.than、Ame.ica、Llan.antffraid 等。

但我不希望它包含字符串“am”或“pm”。我试过使用 (?!am|pm) 但这不起作用。它返回错误:“从正则表达式中得到错误‘重复运算符操作数无效’”。

我有以下正则表达式:

REGEXP BINARY '[a-z]\\\.[a-z]'

NB 如果列包含 am OR pm 但也包含类似 bro.ken 的字符串,则需要返回它。

4

3 回答 3

3

逐步构建您的正则表达式:

你想要一切,除了它是一个“独立的”上午或下午:

  • [b-oq-z]{1}\.[a-ln-z]{1}匹配所有x.ya.#or p.#or格式的东西#.m

但是,您也想念a.a, a.b, a.c...。所以添加案例:

  • a\.[^m](对于p-case相同p\.[^m]:)

a.m有效,当 a: 前面有字符时kra.m, tra.m。同样适用于p.merp.m

  • [a-z]{1}[ap]\.m涵盖了这个条件。

现在,我们缺少字符串,其中第二部分更长a.mod, p.markt::

  • [ap]\.m[a-z]+涵盖那个。

最后只是缺少那些以.m但具有不同前缀的结尾:

  • [b-oq-z]{1}\.m

现在应该涵盖所有可能的用例。简单地将模式与 OR ( |) 结合起来,您就完成了:

([b-oq-z]{1}\.[a-ln-z]{1}|a\.[^m]|p\.[^m]|[a-z]{1}[ap]\.m|[ap]\.m[a-z]+|[b-oq-z]{1}\.m)

正则表达式可视化

在 Debuggex 上实时编辑

注意:这不会为您提供 exakt 匹配组。但是由于您在 SQL 查询中使用它,因此只需要匹配的情况。(ark.m将匹配k.m- 但它符合您的规范)

请记住:创建正则表达式时,没有正确的解决方案:只有有效的解决方案,而不是有效的解决方案。a\.[^m]|p\.[^m]等于[ap]\.[^m],这会将模式减少一个或。

当满足 2 个条件时,您已经找到了完美的正则表达式模式:

  • 有用!
  • 4个月后看,你就明白了!
于 2013-08-29T18:29:15.107 回答
1

如果您可以使用断言,这可能会起作用,但不确定回溯。

 #  (?=^.*(?:(?!a\.m|p\.m)[a-z]\.[a-z]|(?:a\.m|p\.m).*(?!a\.m|p\.m)[a-z]\.[a-z]))

 (?=
      ^
      .* 
      (?:
           (?! a\.m | p\.m )
           [a-z] \. [a-z] 
        |  
           (?: a\.m | p\.m )
           .* 
           (?! a\.m | p\.m )
           [a-z] \. [a-z]
      )
 )
于 2013-08-29T18:55:43.577 回答
0

我会这样做:

SELECT 'Ame.ica wakes up at 8 a.m.' REGEXP
   '[b-oq-z]\\.[a-ln-z]|[ap]\\.[^m]|[^ap]\\.m|[[:alpha:]][ap]\\.m|[ap]\\.m[[:alpha:]]' findme,
  'America wakes up at 8 a.m.' REGEXP
   '[b-oq-z]\\.[a-ln-z]|[ap]\\.[^m]|[^ap]\\.m|[[:alpha:]][ap]\\.m|[ap]\\.m[[:alpha:]]' dontfindme

这是狗鼻子答案的一个更短的版本,因此稍微快一点。它也是为具有稍微奇怪的[[:alpha:]]类的 MySQL 量身定制的。

于 2013-08-29T19:58:06.987 回答