我正在尝试编写一个正则表达式,它可以匹配字符串中的单词和theese条件:
\b(?=\w{8}\z)(?=[^a-zA-Z]*[a-zA-Z]{1})(?=(?:[\D]*[\d]){7}).*\b
这可以找到"123r1234"
和"foo 123r1234"
,但找不到"foo bar 123r1234 foo"
。
我试图添加单词边界但它不起作用。
我的正则表达式有什么问题,我该如何解决呢?
感谢。
答案 0 :(得分:3)
您可以使用以下正则表达式:
\b(?=[^a-zA-Z]*[a-zA-Z])(?=(?:\D*\d){7})\w{8}\b
请参阅demo
这里有几点需要注意:
\d
)括在字符类中(模式变得太笨拙且可读性较差)。因此,请使用\D
代替[\D]
。(?=\w{8})
可以在最后轻松替换.*
。(?=\w{8}\z)
前瞻包含一个字符串结尾\z
锚点,它强制在字符串末尾匹配,而您需要(如我所知)结束< EM>字 [a-zA-Z]{1}
等于[a-zA-Z]
,因为{1}
表示*恰好是一次重复,而且它是多余的(同样,正则表达式应该尽可能简洁明了)。 / LI>
醇>
更新(+1转到@ Jonny5)
还有另一种解决当前问题的方法:让单词包含8个单词字符,但只匹配1个用任意数字括起来的字母。这可以通过
来实现(?i)\b(?=\w{8}\b)\d*[a-z]\d*\b
请参阅another demo(此处使用注意i
修饰符)
答案 1 :(得分:2)
您可以删除最后一个星号并通过8计数器进行更改。
\b(?=[^a-zA-Z]*[a-zA-Z])(?=(?:[\D]*[\d]){7})\w{8}\b
你可以在这里查看它: