2013-08-29 73 views
0

傍晚,MySQL正则表达式[az] 。[az]但不是am或pm

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

John.than,Ame.ica,Llan.antffraid等

,但我不希望这包括字符串 'AM'或'下午'。我尝试过使用(?!a.m. | p.m。),但这不起作用。它返回错误:“出错”重复 - 运算符操作数无效“来自正则表达式”。

我有以下的正则表达式:

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

注:如果一个柱子包括a.m.或p.m.但也包含一个像bro.ken这样的字符串,它需要返回。

+2

为什么不只是添加额外的'不喜欢%a.m.%'条件? –

+0

@Michael Berkowski:因为我需要可能包含a.m.的列,但也包含要返回的[a-z] \。[a-z]的其他实例。 –

回答

3

构建一步您正则表达式的步骤:

你想要的一切,但它的“独立”上午或下午:

  • [b-oq-z]{1}\.[a-ln-z]{1}相匹配的格式x.y不是a.#p.##.m的一切

然而,你错过了a.aa.b,a.c ......也。这样添加的情况:

  • a\.[^m](同为p -cases:p\.[^m]

a.m是有效的,当在所述一个前字符:kra.m, tra.m。这同样适用于p.merp.m

  • [a-z]{1}[ap]\.m覆盖该condtion。

现在,我们缺少的字符串,其中第二部分是长: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) 

Regular expression visualization

Edit live on Debuggex

注意:这会不会给你EXAKT比赛组。但是,由于您仅在一个SQL查询中使用它,因此需要匹配。 (ark.mk.m匹配 - 但它满足您的规格)

记住:当创建一个正则表达式,没有解决方案:只要做事的人,而不是做事的人。 a\.[^m]|p\.[^m]等于[ap]\.[^m],这将使模式减少一个OR。

你已经找到了完美的正则表达式点模式,当两个条件都满足:

  • 它的工作原理!
  • 你可以在4个月内看到它了解它!
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] 
    ) 
) 
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 

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

+0

可以解释downvote吗?我测试了这个,它在SQLfiddle上工作。 – funkwurm

相关问题