7

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

案例示例:

  • "32 32 32 32 34" --> 匹配
  • "MM" --> 匹配
  • " " --> 匹配
  • "1234" --> 不匹配

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

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

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

4

2 回答 2

4

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

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

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

使?:组不捕获。

正则表达式的第一部分最多捕获三个不同的非空格字符\1, \2, \3, 然后(?:\s|\1|\2|\3)*确保只有这些字符或空格\s才能出现在字符串的末尾之前$

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

var str = 'ABC ABC';
var chars = '';

str.replace( /\S/g,  function ( m ) {
    if ( chars.indexOf(m) == -1 ) chars += m;
});

chars.length;    // 3
于 2013-04-30T10:25:22.853 回答
0

好q。这是我能想到的最简单的:

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

解释:

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

可视化:

正则表达式可视化

演示:

在这里测试它:Debuggex Demo

于 2013-12-19T14:03:44.117 回答