2

文字 x、y、および z のみを含む文字列を検出できる正規表現を作成する必要がありますが、これらの文字は隣接する文字とは異なります。

ここに例があります

xyzxzyz = パス

xyxyxyx = パス

xxyzxz = 失敗 (x の繰り返し)

zzzxxzz = 失敗 (隣接する文字が繰り返されます)

((x|y|z)?)*で動くと思ったのですが、うまくいかないようです。助言がありますか?

編集

先読みまたは後読み操作を許可しない回答を探していることに注意してください。許可される唯一の操作は、代替、連結、グループ化、および閉鎖です

4

4 に答える 4

13
于 2012-12-03T04:25:22.513 に答える
3

これはあなたが望むことをするはずです:

^(?!.*(.)\1)[xyz]*$

(もちろん、先読み機能のあるエンジンのみ)

コンテンツ自体は、2 番目の部分[xyz]*(任意の数の x、y、または z 文字) によって処理されます。アンカー^...$は、文字列全体でなければならないことを示しています。また、特別な条件 (隣接するペアがない) は(?!.*(.)\1)、文字列のどこにも同じ文字が続く文字があってはならないという否定的な先読みによって処理されます。

于 2012-12-03T02:40:01.177 に答える
1

今日歩いているときに思いつき、それを正規表現に入れましたが、正しく一致しないパターンをまだ見つけていません。だからここに正規表現があります:

^((y|z)|((yz)*y?|(zy)*z?))?(xy|xz|(xyz(yz|yx|yxz)*y?)|(xzy(zy|zx|zxy)*z?))*x?$

ここにフィドルがあります!

パターンの不一致を見つけたら教えてください。修正を試みます。少し遅いことはわかっていますが、解決できなかったという事実に本当に悩まされました。

于 2012-12-03T03:18:38.007 に答える