5

すべての文字が一意である場合にのみ、特定の長さのアドホックな文字グループに一致する正規表現を探しています。

指定された文字列の例:

12313221323131232111212212111122233211221331

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 に答える