匹配具有独特数字字母数字字(NOT NUMERIC-ONLY字)

时间:2019-02-02 06:44:36

标签: javascript regex

使用正则表达式,我想选择仅在其中:

  • 是字母数字
  • 不只包含数字
  • 不只包含字母
  • 具有唯一的数字(1个或更多)

我对正则表达式不是很满意,但是到目前为止,我已经尝试过[^\d\s]*(\d+)(?!.*\1),使我无法接近所需的输出:(

以下是输入字符串:

I would like abc123 to match but not 123.
ab12s should also match
Only number-words like 1234 should not match
Words containing same numbers like ab22s should not match
234 should not match
hel1lo2haha3hoho4
hel1lo2haha3hoho3

预期匹配:

abc123
ab12s
hel1lo2haha3hoho4

4 个答案:

答案 0 :(得分:8)

您可以使用

\b(?=\d*[a-z])(?=[a-z]*\d)(?:[a-z]|(\d)(?!\w*\1))+\b

https://regex101.com/r/TimjdW/3

锚的开始和在字边界的图案的端部\b,则:

  • (?=\d*[a-z])-在单词中的某个位置前瞻字母字符
  • (?=[a-z]*\d)-在单词中的某个地方先行查找数字
  • (?:[a-z]|(\d)(?!\w*\1))+重复匹配:
    • [a-z]-任何字母字符,或
    • (\d)(?!\w*\1) - 其不以相同的字再次发生一个数字

答案 1 :(得分:3)

由于它不会为每个字符断定负前瞻,因此使用了更短,更快的正则表达式来实现它:

/\b(?=[a-z]*\d)(?=\d*[a-z])(?!\w*(\d)\w*\1)[a-z\d]+\b/ig

RegEx Demo

RegEx详细信息:

  • \b:单词边界
  • (?=[a-z]*\d):确保我们至少有一位数字
  • (?=\d*[a-z]):确保我们至少有一封信
  • (?!\w*(\d)\w*\1):确保单词中的任何地方都不会重复数字
  • [a-z\d]+:匹配1个以上的字母数字
  • \b:单词边界

答案 2 :(得分:2)

您可以使用一个否定的前瞻断言所有条件:

\b(?![a-z]+\b|\d+\b|\w*(\d)\w*\1)[a-z\d]+\b

请参见live demo here

重要的部分是从\b开始比赛,然后立即寻找条件:

  • [a-z]+\b仅字母

  • \d+\b仅数字

  • \w*(\d)\w*\1有重复的数字

答案 3 :(得分:1)

您可以使用

\b(?!\w*(\d)\w*\1)(?=(?:[a-z]+\d+)|(?:\d+[a-z]+))[a-z0-9]+\b
  • \b-单词边界。
  • (?!\w*(\d)\w*\1)-检查唯一数字的条件。
  • (?=(?:[a-z]+\d+)|(?:\d+[a-z]+))-检查字母数字单词的条件。
  • [a-z0-9]+-匹配a to z0 to 9

Demo