我试图创建正则表达式来查找包含最多三个不同字符的所有输入。输入多长时间无关紧要。箱子如何使用正则表达式检查不同字符的数量?
实施例:
- “32 32 32 32 34” - >匹配
- “MM” - >匹配
- “” - >匹配
- “1234” - >不匹配
我所做的正则表达式来找出四个或更多不同的字符输入,但现在我需要它在相反的方向...
(.).*(?\1)(.).*(?\1)(?\2)(.).*(?\1)(?\2)(?\3)(.)
主要问题是:如何检查不同字符的数量?
我试图创建正则表达式来查找包含最多三个不同字符的所有输入。输入多长时间无关紧要。箱子如何使用正则表达式检查不同字符的数量?
实施例:
我所做的正则表达式来找出四个或更多不同的字符输入,但现在我需要它在相反的方向...
(.).*(?\1)(.).*(?\1)(?\2)(.).*(?\1)(?\2)(?\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
为什么你在开始和结束时都有斜杠? (提示:斜线与正则表达式没有任何关系,它们是应用程序的语言制品) – Bohemian 2013-04-30 11:25:33
@Bohemian这是一个常见的约定,比如将字符串放在括号内的引号或URL中。不需要迂腐。没有混淆。 – 2013-04-30 13:33:02
@RaymondChen我不同意。这不常见,也不正确。 *一些*语言使用斜杠,但是例如我最熟悉的两种语言(以及非常流行的语言) - Java和SQL - 不使用斜杠。新手用户可能不知道有关斜线和混淆。本网站力求正确。事实是,给出的答案是错误的,即使已经建立了斜杠使用语言(它没有),从技术上讲,它仍然是不正确的,因为斜杠不是所需的*正则表达式的一部分* ,这个问题是关于正则表达式的。 – Bohemian 2013-04-30 14:18:50
良好的Q值。下面是我能想出的最简单的:
^\s*([^\s]{1,3}\s+)*[^\s]{0,3}$
说明:
^\s*
空白的任何量在开始比赛。([^\s]{1,3}\s+)*
匹配1到3之间的重复组 非空白字符后跟至少一个空白字符。 考虑将?:
放在(
之后,以使其成为非捕获组。[^\s]{0,3}
允许字符串以最多三个非空白字符结尾(所以它不必以2所强制的空格结束。)可视化:
演示:
测试在这里:Debuggex Demo
在我看来这是一个非常令人费解的问题,正则表达式来解决。这是一个要求吗?为什么不以更传统的方式解决它? – pcalcao 2013-04-30 10:04:49
从你的第一个例子来判断,空白不计入3个字符? – 2013-04-30 10:16:29
这是使用正则正则表达式无法实现的,因为您需要某种类型的堆栈或计数或状态,这是常规语言不能使用的。实际上,您可能可以解决一些问题,因为大多数正则表达式解析器都没有定义常规语言,但最好使用不同的方法。 – Oliver 2013-04-30 10:18:40