1

これが、正規表現で実行したい変換の表です。

From       To
================
CAT        CAT
EGG        EGG
A          A
Z          Z
AA         ZA
BB         ZB
ZZ         ZZ
AAA        ZZA
HHHHH      ZZZZH

つまり、文字列が2回以上繰り返される同じ文字である場合、最後の文字を除くすべての文字をZに置き換えたいと思います。

私はここで精神的にブロックされています。これは私がこれまでに思いついたものであり、機能しません。

FIND:     ^(?<=\1*?)([A-Z])(?=\1+)$
REPLACE:  Z

キャプチャグループの前に後方参照を使用できるかどうかはわかりませんが、どちらにしても、最初の参照をに置き換えても\1効果.はありません。

私はC#を使用しているので、.NETスタイルの正規表現を探しています。もちろん、通常の文字列操作でこれを行うこともできますが、ビジネスケース固有の正規表現を使用する必要があります。

4

3 に答える 3

3

誰かが黒魔術を注文しましたか?

FIND:    \G([A-Z])(?=\1)
REPLACE: Z

\G各一致を、doesのように文字列の先頭に固定する\Aか、前の一致が終了した位置に固定します。言い換えると、([A-Z])正規表現のは常に次の文字と一致しようとします。先読みのおかげで(?=\1)、次の文字は置き換えたばかりの文字と同じであることがわかります。

また、自己回答の正規表現は私には機能しません。は+何の役にも立ちませんが(結局、次のキャラクターだけを気にします)、何も害はありません。それが私のために機能するようになったのは、を削除することでした$

更新:文字列が2つ以上の同じ文字であり、他には何もないという要件を理解できませんでした。つまり、+$は両方とも必要です。私がいる間、文字列、、、およびをそのままにしておく必要があるという追加の要件にXX対処しXXXます。Voilà!IIIII

\G(?!\A(?:XXX?|III?)$)([A-Z])(?=\1+$)
于 2012-05-14T23:40:16.363 に答える
2

式を文字ごとに一致させたいので、最初に目的の文字を一致させてから、メインの式ではなくそれらのアンカーを含めて、先読みと後読みを行うことができます。

([A-Z])(?<=^\1*)(?=\1+$)

ただし、各キャラクターの文字列全体を歩いているため、パフォーマンスはそれほど高くありません。

正規表現を使用して文字列が同じ文字で構成されていることを検出し、最後の文字を除くすべての文字を通常の文字列置換方法でZに置き換えるか、元の文字列の長さのZの文字列を作成することをお勧めしますたとえば、マイナス1で、元の文字の最初の文字を追加します。

于 2012-05-14T23:05:40.043 に答える
0

おそらく、一致してから置換するようなものが機能する可能性があります。

string [] Samps = {  "CAT",  "EGG",  "A",  "Z",  "AA",  "BB",  "ZZ",  "AAA",  "HHHHH" };
foreach (var item in Samps)
{
    string line = item + "\t\t";
    line += Regex.Match(item, @"^([A-Z])\1+$").Success ?
            Regex.Replace(item, @".(?!$)", "Z") :
            item;
    Console.WriteLine(line);
}

出力

CAT             CAT
EGG             EGG
A               A
Z               Z
AA              ZA
BB              ZB
ZZ              ZZ
AAA             ZZA
HHHHH           ZZZZH
于 2012-05-15T01:30:12.093 に答える