BEGINNER:REGEX匹配数字序列,除非行上存在单词“CODE”

时间:2009-12-23 20:49:14

标签: regex regex-negation

我已经能够通过正则表达式绊倒了很长一段时间,但是唉,我无法帮助有需要的朋友。

我的“朋友”正在尝试匹配文本文件中符合以下条件的所有行:

  1. 仅限7到10位数字(0123456或0123456789)
  2. 只有7到10位数字,然后是破折号,然后是另外两位数字(0123456-01或0123456789-01)
  3. 匹配以上任何之外的任何字词代码/代码或密码/密码之前要匹配的数字(例如“访问代码:16434629”或“密码5253443-12“)
  4. 编辑:只需要匹配的数字,别无其他。
  5. 这是我见过的最糟糕的正则表达式,“他”给了我:

    ^(?=.*?[^=/%:]\b\d{7,10}((\d?\d?)|(-\d\d))?\b)((?!Passcode|passcode|Code|code).)*$
    

    ...

    问题:有没有办法使用短正则表达式查找符合上述条件的所有行?

    假设PCRE。我的朋友提前感谢你。 ; - )

    BTW - 我无法找到stackoverflow.com或superuser.com中列出的任何其他问题,可以准确回答这个问题。

    编辑:我正在使用Kodos Python Regex Debugger来验证和测试正则表达式。

2 个答案:

答案 0 :(得分:4)

(?<!(?:[Pp]asscode|[Cc]ode).*)[0-9]{7,10}(?:-[0-9]{2})?

评论版:

(?<!                 # Begin zero-width negative lookbehind. (Makes sure the following pattern can't match before this position)
(?:                  # Begin non-matching group
[Pp]asscode          # Either Passcode or passcode
|                    # OR
[Cc]ode              # Either Code or code
)                    # End non-matching group
.*                   # Any characters
)                    # End lookbehind
[0-9]{7,10}          # 7 to 10 digits
(?:                  # Begin non-matching group
-[0-9]{2}            # dash followed by 2 digits
)                    # End non-matching group
?                    # Make last group optional

编辑:评论讨论后的最终版本 -

/^(?!\D*(?:[Pp]asscode|[Cc]ode))\D*([0-9]{7,10}(?:-[0-9]{2})?)/

(导致第一个捕获缓冲区)

答案 1 :(得分:1)

你可以通过一个讨厌的正则表达式来获得帮助......

...或者您可以使用两个简单正则表达式。一个匹配您想要的,一个过滤您想要的东西。更简单,更易读。

您想阅读哪一个?

$foo =~ /(?<!(?:[Pp]asscode|[Cc]ode).*)[0-9]{7,10}(?:-[0-9]{2})?/

$foo =~ /\d{7,10}(-\d{2})?/ and $foo !~ /(access |pass)code/i;

编辑:不区分大小写。