使用正则表达式的字符串中相似字符的唯一序列

时间:2019-04-04 10:16:30

标签: javascript regex

我有一些测试字符串:

  1. “ x”
  2. “毫米”
  3. “ x毫米”
  4. “ yy x mm”
  5. “ xx毫米y毫米”

我想制作一个正则表达式,它应该匹配字符串1,2,3,4而不是5。

所以我的比赛限制是:

  1. 一个字母序列应该在字符串中出现一次。 (例如,“ y”是一个y序列,而“ yy”是两个y的序列,但是它们包含相同的字母,因此它们是矛盾的,不能一起出现)
  2. 字符串中仅允许使用特定的字母(对于我的情况是“ xym”)。
  3. 任何序列都可以出现在字符串的开头,中间或结尾。但是,如果另一个字母序列分别在其之前或之后,则应在其之前或之后加上非单词字符。
  4. 字符串中不必包含所有字母序列。

注意:-我只需要一个正则表达式来解决此问题。因为使用单独的正则表达式和迭代,我已经做到了。我正在寻找单行解决方案来验证我的字符串。

我尝试过的解决方案是:

/(?=^[xym\W]+$)((?=^([^m]*\W)?m+(\W[^m]*)?$)|(?=^([^x]*\W)?x+(\W[^x]*)?$)|(?=^([^y]*\W)?y+(\W[^y]*)?$))/

但是它也匹配第5种情况。

1 个答案:

答案 0 :(得分:2)

您可以使用

/^(?!.*\b([xym])\1*\b.*\b\1+\b)(?:\s*\b([xym])\2*\b)*\s*$/

请参见regex demo

详细信息

  • ^-字符串的开头
  • (?!.*\b([xym])\1*\b.*\b\1+\b)-如果在字符串开始后立即出现匹配,则负匹配将使匹配失败
    • .*-除换行符之外的任意0+个字符,并且尽可能多
    • \b([xym])\1*\b-由相同的字符xym
    • 组成的整个单词
    • .*-除换行符之外的任意0+个字符,并且尽可能多
    • \b\1+\b-由第1组中捕获的一个字符组成的整个单词
  • (?:\s*\b([xym])\2*\b)*-重复0次或更多次
    • \s*-0个或更多空白字符
    • \b([xym])\2*\b-由1个或多个相同字符,xym组成的整个单词
  • \s*-0个或更多空白字符
  • $-字符串的结尾。