正则表达式:匹配数字序列而不匹配先前的匹配

时间:2015-09-22 19:46:55

标签: regex

我正在查看3个逗号分隔值的数字序列,并希望搜索1,2,3的任何序列。我想匹配1,2,3; 3,2,1; 2,1,3;我不想匹配1,1,1; 1,2,2; 1,3,3; 3,3,1; 2,3,3;使用regexr.com进行正则表达式解析。

[123],[123],[123]

是我开始使用的,直到我意识到它匹配任何字符而不是字符序列。

我正在研究正面/负面的前瞻,但无法想到如何在逻辑上对其进行构造,因此正则表达式与指定序列中先前匹配的数字不匹配。

我在这里错过了什么基本的东西?

2 个答案:

答案 0 :(得分:5)

您可以使用基于前瞻和后向引用的正则表达式:

([123]),((?!\1)[123]),((?!\1|\2)[123])

RegEx Demo

RegEx分手:

([123])          # match 1 or 2 or 3 and capture it in group #1
,                # match literal comma
((?!\1)[123])    # match 1 or 2 or 3 if it is NOT same as group #1 & capture it in group #2
,                # match literal comma
((?!\1|\2)[123]) # match 1 or 2 or 3 if it is NOT same as group #1 OR #2

答案 1 :(得分:0)

答案#1是@ anubhava的解决方案,只要所有3个整数都是唯一的,他的解决方案就能正确匹配任何序列。但是,在搜索序列有2个重复整数的情况下,假设您要搜索的序列为1,2,2,则使用以下正则表达式。不敢相信我这么努力:P

((1,2,2)|(2,1,2)|(2,2,1))

我意识到在2个重复整数的情况下,只有3个可能的匹配可用。因此,我们可以简单地从字面上搜索这三种情况,而不是尝试构建复杂的lookbehind / lookahead正则表达式。使用捕获组应标记匹配的内容。

显然,在3个重复整数的序列中,例如3,3,3,只有一个可能的匹配,所以你按字面搜索它。