すべての文字が一意である場合にのみ、特定の長さのアドホックな文字グループに一致する正規表現を探しています。
指定された文字列の例:
12313221323131232111212212111122233211221331
123, 132, 213, 231, 312, 321
は一致し
112, 122, 121, 111, 313, 322, 221, 323, 131
、 などは一致しません。
やってみ(?:([0-9])(?!.{3}\1)){3}
たけど全然違う
すべての文字が一意である場合にのみ、特定の長さのアドホックな文字グループに一致する正規表現を探しています。
指定された文字列の例:
12313221323131232111212212111122233211221331
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