我已经能够通过正则表达式绊倒了很长一段时间,但是唉,我无法帮助有需要的朋友。
我的“朋友”正在尝试匹配文本文件中符合以下条件的所有行:
这是我见过的最糟糕的正则表达式,“他”给了我:
^(?=.*?[^=/%:]\b\d{7,10}((\d?\d?)|(-\d\d))?\b)((?!Passcode|passcode|Code|code).)*$
...
问题:有没有办法使用短正则表达式查找符合上述条件的所有行?
假设PCRE。我的朋友提前感谢你。 ; - )
BTW - 我无法找到stackoverflow.com或superuser.com中列出的任何其他问题,可以准确回答这个问题。
编辑:我正在使用Kodos Python Regex Debugger来验证和测试正则表达式。
答案 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;
编辑:不区分大小写。