首页 > 解决方案 > 使用正则表达式的字符串中相似字符的唯一序列

问题描述

我有一些测试字符串:

  1. “X”
  2. “ 毫米 ”
  3. “×毫米”
  4. “年×毫米”
  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 种情况。

标签: javascriptregex

解决方案


您可以使用

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

请参阅正则表达式演示

细节

  • ^- 字符串的开始
  • (?!.*\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 个或更多空白字符
  • $- 字符串结束。

推荐阅读