正则表达式匹配某些条件

时间:2015-06-05 21:17:40

标签: ruby regex

基本上我想要一个匹配这个条件的正则表达式

  1. 前8个字符应在[a-zA-Z]
  2. 之内
  3. 后跟任意位数
  4. 后跟任何单词字符,但不会立即被"或"或"和"
  5. 我目前有这个正则表达式:

    ^(?i:([a-z]{1,8})(\d+)((?!or|and).)+)$
    

    这适用于以下示例:

    • ABCDEFGH 1 ZZZ
    • GFEDCBAH 99 ZZZ99

    但不是这个,因为我认为如果满足" OR"在" FORALL":

    • WOLRDWAR 2 FORALL

    预期产出:

    AAAAAAAA100NANDROID - should match
    AAAAAAAA100ANDROID - should not match
    AAAAAAAA100OR - should not match
    AAAAAAAA100AND - should not match
    

    基本上我不希望FOR匹配OR,我的问题的任何解决方案?顺便说一句,这是Ruby

4 个答案:

答案 0 :(得分:1)

您可以将正则表达式调整为:

/^(?i:([a-z]{8})(\d+)((?!or|and).*))$/

RegEx Demo

答案 1 :(得分:1)

我认为你正在寻找这个(我正在使用一个积极的后视(?<=\d),因此我们只排除前面有数字的orand

^(?i:([a-z]{1,8})(\d+)((?!(?<=\d)(?:or|and)).)+)$

请参阅demo

答案 2 :(得分:1)

anubhava的答案似乎与正确的值匹配,但所有以前的答案似乎都包含一个或多个捕获组,我在原始帖子中看不到这些组。这是另一种可能的解决方案,它将匹配整个字符串而不使用组:

^(?i:[a-z]{8}\d+(?!or|and).*)$

Rubular Demo

答案 3 :(得分:1)

@anubhava正则表达式和其他人喜欢的问题是, 在断言后使用.*过于自由了。

这意味着它可以在断言之前拆分表达式然后转换 在另一边拿起它。

例如,^(?i:([a-z]{8})(\d+)((?!or|and).*))$可以轻松匹配AAAAAAAA100AND

这是一种罕见的情况,会导致引擎回溯一个数字,以满足断言 通常,如果没有使用.*,则无需担心。

这可以通过在断言中注入\d*构造来修复 请注意,断言是独立的,它们首先匹配,然后检查它是否应该失败。但是,如果可以的话,这并不能阻止引擎回溯。

^(?i:([a-z]{8})(\d+)((?!\d*(?:or|and)).*))$

扩展:

 ^ 
 (?i:
      ( [a-z]{8} )                  # (1)
      ( \d+ )                       # (2)

      (                             # (3 start)
           (?!
                \d* 
                (?: or | and )
           )
           .* 
      )                             # (3 end)
 )
 $