5

我正在寻找一个正则表达式,它仅在其所有字符都是唯一的情况下才匹配特定长度的特定字符组。

对于给定的字符串示例:

123132213231312321112122121111222333211221331

123, 132, 213, 231, 312, 321匹配 112, 122, 121, 111, 313, 322, 221, 323, 131,等不匹配。

我试过(?:([0-9])(?!.{3}\1)){3}但完全错误

4

3 回答 3

4

遍历输入字符串,在每次迭代中找到该表达式的匹配项,直至并包括前一个匹配项的第一个字符,直到没有匹配项:

((\d)((?!\2)\d)((?!\2)(?!\3)\d))

你可以做一个 findAll,但是你不会检测到重叠的匹配,比如“12321”会有。你只会找到第一个:“123”

当然,这只适用于数字。如果你还想匹配单词字符,你可以这样做:

((\w)((?!\2)\w)((?!\2)(?!\3)\w))

如果您想要更长的长度,只需在构建正则表达式时遵循该模式:

((\w)((?!\2)\w)((?!\2)(?!\3)\w)((?!\2)(?!\3)(?!\4)\w))

所以,我只希望 Python 正确的代码......:

max=<your arbitrary length>
regex = "((\\w)"
for i in range(1, max-1):
    regex += "("
    for j in range(2, i+1):
        regex +="(?!\\"+j+")"
    regex += "\\w)"
regex = ")"

于 2013-10-25T16:49:35.003 回答
2

看来您正在使用python。正则表达式不是灵丹妙药,也绝对不是解决问题的直接方法(尤其是因为表达式会随着您要分析的长度而变化)编写一些代码会更好并提供更好的性能。

这是解决问题的 Scala 代码示例

"123132213231312321112122121111222333211221331".sliding(3).map(_.distinct).filter(_.size == 3).mkString("-")

输出:

123-231-132-213-132-231-312-123-321-321-213
于 2013-10-25T17:06:07.460 回答
1

此正则表达式为 1-10 位数字,请自行选择。

 ( \d )
 (?! \1 )
 ( \d )
 (?! \1 | \2 )
 ( \d )
 (?! \1 | \2 | \3 )
 ( \d )
 (?! \1 | \2 | \3 | \4 )
 ( \d )
 (?! \1 | \2 | \3 | \4 | \5 )
 ( \d )
 (?! \1 | \2 | \3 | \4 | \5 | \6 )
 ( \d )
 (?! \1 | \2 | \3 | \4 | \5 | \6 | \7 )
 ( \d )
 (?! \1 | \2 | \3 | \4 | \5 | \6 | \7 | \8 )
 ( \d )
 (?! \1 | \2 | \3 | \4 | \5 | \6 | \7 | \8 | \9 )
 \d 
于 2013-10-25T17:42:16.053 回答