2013-04-30 93 views
6

我试图创建正则表达式来查找包含最多三个不同字符的所有输入。输入多长时间无关紧要。箱子如何使用正则表达式检查不同字符的数量?

实施例:

  • “32 32 32 32 34” - >匹配
  • “MM” - >匹配
  • “” - >匹配
  • “1234” - >不匹配

我所做的正则表达式来找出四个或更多不同的字符输入,但现在我需要它在相反的方向...

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

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

+6

在我看来这是一个非常令人费解的问题,正则表达式来解决。这是一个要求吗?为什么不以更传统的方式解决它? – pcalcao 2013-04-30 10:04:49

+1

从你的第一个例子来判断,空白不计入3个字符? – 2013-04-30 10:16:29

+2

这是使用正则正则表达式无法实现的,因为您需要某种类型的堆栈或计数或状态,这是常规语言不能使用的。实际上,您可能可以解决一些问题,因为大多数正则表达式解析器都没有定义常规语言,但最好使用不同的方法。 – Oliver 2013-04-30 10:18:40

回答

3

下面将字符串匹配最多三个不同的非空格字符

^\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 
+1

为什么你在开始和结束时都有斜杠? (提示:斜线与正则表达式没有任何关系,它们是应用程序的语言制品) – Bohemian 2013-04-30 11:25:33

+2

@Bohemian这是一个常见的约定,比如将字符串放在括号内的引号或URL中。不需要迂腐。没有混淆。 – 2013-04-30 13:33:02

+1

@RaymondChen我不同意。这不常见,也不正确。 *一些*语言使用斜杠,但是例如我最熟悉的两种语言(以及非常流行的语言) - Java和SQL - 不使用斜杠。新手用户可能不知道有关斜线和混淆。本网站力求正确。事实是,给出的答案是错误的,即使已经建立了斜杠使用语言(它没有),从技术上讲,它仍然是不正确的,因为斜杠不是所需的*正则表达式的一部分* ,这个问题是关于正则表达式的。 – Bohemian 2013-04-30 14:18:50

0

良好的Q值。下面是我能想出的最简单的:

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

说明:

  1. ^\s*空白的任何量在开始比赛。
  2. ([^\s]{1,3}\s+)*匹配1到3之间的重复组 非空白字符后跟至少一个空白字符。 考虑将?:放在(之后,以使其成为非捕获组。
  3. 最后的[^\s]{0,3}允许字符串以最多三个非空白字符结尾(所以它不必以2所强制的空格结束。)

可视化:

Regular expression visualization

演示:

测试在这里:Debuggex Demo

相关问题