如何使用正则表达式检查不同字符的数量?

时间:2013-04-30 10:02:27

标签: regex

我正在尝试创建正则表达式以查找包含最多三个不同字符的所有输入。输入有多长并不重要。

案例:

  • “32 32 32 32 34” - >匹配
  • “MM” - >匹配
  • “” - >匹配
  • “1234” - >没有比赛

我已经完成了正则表达式以查找四个或更多不同字符的输入,但现在我需要它以相反的方式...

(.).*(?\1)(.).*(?\1)(?\2)(.).*(?\1)(?\2)(?\3)(.)

主要问题是:如何查看不同字符的数量?

2 个答案:

答案 0 :(得分:4)

以下内容将匹配最多包含三个不同非空格字符的字符串

^\s*(\S)?(?:\s|\1)*(\S)?(?:\s|\1|\2)*(\S)?(?:\s|\1|\2|\3)*$

(\S)匹配一个非空格字符并捕获它,以便稍后可以使用反向引用在正则表达式中引用它。 \1。使用?中的(\S)?,因此字符串可以包含零,一,二或三种类型的非空格字符。

?:使群组无法捕捉。

正则表达式的第一部分最多可捕获三个不同的非空格字符\1\2\3,然后(?:\s|\1|\2|\3)*仅确保那些字符或空格{然后{1}}可以出现在字符串\s的结尾之前。

一种方法,在Javascript中,使用正则表达式计算字符串中不同非空格字符的数量:

$

答案 1 :(得分:0)

好q。这是我能提出的最简单的方法:

^\s*([^\s]{1,3}\s+)*[^\s]{0,3}$

<强>解释

  1. ^\s*在开始时匹配任意数量的空格。
  2. ([^\s]{1,3}\s+)*匹配一到三个重复组 非空白字符后跟至少一个空格字符。 考虑将?:放在(之后,使其成为非捕获组。
  3. 最后的[^\s]{0,3}允许字符串以最多三个非空格字符结尾(因此它不必以2强制执行的空格结尾。)
  4. <强>可视化:

    Regular expression visualization

    <强>演示:

    在此测试:Debuggex Demo