我正在寻找一个正则表达式,它仅在其所有字符都是唯一的情况下才匹配特定长度的特定字符组。
对于给定的字符串示例:
123132213231312321112122121111222333211221331
123, 132, 213, 231, 312, 321
匹配
112, 122, 121, 111, 313, 322, 221, 323, 131
,等不匹配。
我试过(?:([0-9])(?!.{3}\1)){3}
但完全错误
我正在寻找一个正则表达式,它仅在其所有字符都是唯一的情况下才匹配特定长度的特定字符组。
对于给定的字符串示例:
123132213231312321112122121111222333211221331
123, 132, 213, 231, 312, 321
匹配
112, 122, 121, 111, 313, 322, 221, 323, 131
,等不匹配。
我试过(?:([0-9])(?!.{3}\1)){3}
但完全错误
遍历输入字符串,在每次迭代中找到该表达式的匹配项,直至并包括前一个匹配项的第一个字符,直到没有匹配项:
((\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 = ")"
唷
看来您正在使用python。正则表达式不是灵丹妙药,也绝对不是解决问题的直接方法(尤其是因为表达式会随着您要分析的长度而变化)编写一些代码会更好并提供更好的性能。
这是解决问题的 Scala 代码示例
"123132213231312321112122121111222333211221331".sliding(3).map(_.distinct).filter(_.size == 3).mkString("-")
输出:
123-231-132-213-132-231-312-123-321-321-213
此正则表达式为 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