我正在寻找一个正则表达式,只有当它的所有字符都是唯一的时,它才会匹配特定长度的特殊字符组。
对于给定的字符串示例:
123132213231312321112122121111222333211221331
123, 132, 213, 231, 312, 321
匹配并且
112, 122, 121, 111, 313, 322, 221, 323, 131
等不匹配。
我试过(?:([0-9])(?!.{3}\1)){3}
,但这是完全错误的
答案 0 :(得分:2)
迭代输入字符串,每次迭代找到此表达式的匹配,切断并包括上一个匹配的第一个字符,直到没有匹配:
((\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 = ")"
呼
答案 1 :(得分:2)
好像你正在使用python。正则表达式不是一个银弹,绝对不是你的问题的直接解决方案(特别是因为表达式改变你想要分析的长度) 编写一些代码会更好,并提供更好的性能。
以下是Scala中解决问题的代码示例
"123132213231312321112122121111222333211221331".sliding(3).map(_.distinct).filter(_.size == 3).mkString("-")
输出:
123-231-132-213-132-231-312-123-321-321-213
答案 2 :(得分: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