正则表达式与单词不匹配,如果它不是最后一个单词

时间:2015-08-28 07:25:52

标签: regex

我正在尝试编写一个正则表达式,它可以匹配字符串中的单词和theese条件:

  1. 这个词的长度必须是8个字符。
  2. 这个词在任何位置都必须有1个字母字符 字。
  3. 该单词的任何位置都必须有7位数字。
  4.   

    \b(?=\w{8}\z)(?=[^a-zA-Z]*[a-zA-Z]{1})(?=(?:[\D]*[\d]){7}).*\b

    这可以找到"123r1234""foo 123r1234",但找不到"foo bar 123r1234 foo"。 我试图添加单词边界但它不起作用。 我的正则表达式有什么问题,我该如何解决呢?

    感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用以下正则表达式:

\b(?=[^a-zA-Z]*[a-zA-Z])(?=(?:\D*\d){7})\w{8}\b

请参阅demo

这里有几点需要注意:

  1. 没有必要将单个速记类(如\d)括在字符类中(模式变得太笨拙且可读性较差)。因此,请使用\D代替[\D]
  2. 预测数量的规则应该等于条件数 - 1 (参见Fine-Tuning: Removing One Condition at rexegg.com)。大多数情况下,只有1个字符/字符类的长度限制前瞻是被移植到基本模式的有效候选者。在此,(?=\w{8})可以在最后轻松替换.*
  3. (?=\w{8}\z)前瞻包含一个字符串结尾\z锚点,它强制在字符串末尾匹配,而您需要(如我所知)结束< EM>字
  4. [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

你可以在这里查看它:

https://regex101.com/r/bX6rK8/1