【问题标题】:Match the alphanumeric words(NOT NUMERIC-ONLY words) which have unique digits匹配具有唯一数字的字母数字单词(NOT NUMERIC-ONLY words)
【发布时间】:2019-02-02 15:04:29
【问题描述】:

使用正则表达式,我只想选择 单词 其中:

  • 是字母数字的
  • 不要只包含数字
  • 不只包含字母
  • 有唯一编号(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

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    你可以使用

    \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) - 在同一个单词中不再出现的数字

    【讨论】:

      【解决方案2】:

      这里有一个更短更快的正则表达式来实现它,因为它不会为每个字符断言负前瞻:

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

      RegEx Demo

      正则表达式详细信息:

      • \b:字边界
      • (?=[a-z]*\d): 确保我们至少有一个数字
      • (?=\d*[a-z]): 确保我们至少有一封信
      • (?!\w*(\d)\w*\1): 确保单词中没有重复数字
      • [a-z\d]+: 匹配 1+ 个字母数字
      • \b:字边界

      【讨论】:

      • @ManJoey:我相信选择的正则表达式对于更大的字符串会更慢
      • @anubhava, 1 in (?!\w*(\d)\w*\1) 表示(\d) 保存在内存的第一个缓冲区(如sed)之类的东西,对不起,我正在学习正则表达式,所以想和你一起检查一下一次。
      • 是的,没错。 \1 是捕获组 #1 的反向引用,即 (\d)
      【解决方案3】:

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

      \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 有一个重复数字

      【讨论】:

      • 谢谢,虽然不知道为什么一个带有交替的否定前瞻比 regex101 上的多个断言显示更多的步骤(如我的回答)
      • @anubhava 是的,这取决于输入字符串。例如,考虑在您的解决方案中切换前两个前瞻。你会看到it increases
      【解决方案4】:

      你可以用这个

      \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

      【讨论】:

      • 查看这里的所有答案让我想起了为什么我认为正则表达式不是解决此类问题的最佳方法……它们非常巧妙,但我不想调试或维护他们中的任何一个!
      • @gidds 您可以像处理任何编程问题一样处理它们 - 将问题分解为逻辑组,(重新?)编写并验证每个组,然后放入它组合成一个单一的模式。 REs 是匹配字符串的一种非常简洁的方式——它们非常灵活,而且大多与语言无关,这是一个巨大的优势。只要要调试的模式具有描述性 cmets(就像在此处的答案中一样),对于具有一点 RE 经验的人来说应该一点也不难,IMO
      猜你喜欢
      • 2013-08-25
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 2022-12-10
      相关资源
      最近更新 更多