0

C#で作成しているアプリの一部は、文字列内の特定のサブ文字列を、のような角かっこ内の値に置き換えます[11]。多くの場合、直後に同じ値が存在する可能性があるため、テキストを1つのように組み合わせてテキストの量を減らしたいと思います。[11,numberOfSame]

たとえば、文字列に次のものが含まれている場合:
blahblah[122][122][122]blahblahblahblah[18][18][18][18]blahblahblah

必要な新しい文字列は次のようになります。
blahblah[122,3]blahblahblahblah[18,4]blahblahblah

誰かが私がこれを行う方法を知っていますか?ありがとう!:)

4

2 に答える 2

2
Regex.Replace("blahblah[122][122][122]blahblahblahblah[18][18][18][18]blahblahblah",
    @"(\[([^]]+)])(\1)+",
    m => "[" + m.Groups[2].Value + "," + (m.Groups[3].Captures.Count + 1) + "]")

戻り値:

blahblah[122,3]blahblahblahblah[18,4]blahblahblah

正規表現の説明:

(           Starts group 1
  \[        Matches [
  (         Starts group 2
    [^]]+   Matches 1 or more of anything but ]
  )         Ends group 2
  ]         Matches ]
)           Ends group 1
(           Starts group 3
  \1        Matches whatever was in group 1
)           Ends group 3
+           Matches one or more of group 3

ラムダの説明:

m =>                                Accepts a Match object
"[" +                               A [
m.Groups[2].Value +                 Whatever was in group 2
"," +                               A ,
(m.Groups[3].Captures.Count + 1) +  The number of times group 3 matched + 1
"]"                                 A ]

私はこのオーバーロードを使用しています。これは、置換値を計算するためのデリゲートを受け入れます。

于 2012-12-03T15:49:18.263 に答える
1
string input = "[122][44][122]blah[18][18][18][18]blah[122][122]";
string output = Regex.Replace(input, @"((?<firstMatch>\[(.+?)\])(\k<firstMatch>)*)", m => "[" + m.Groups[2].Value + "," + (m.Groups[3].Captures.Count + 1) + "]");

戻り値:

[122,1][44,1][122,1]blah[18,4]blah[122,2]

説明:

(?<firstMatch>\[(.+?)\])[123]グループに一致し、グループfirstMatchに名前を付けます

\k<firstMatch>firstMatchグループによって一致したテキストに一致し、*を追加すると0回以上一致し、ラムダで使用されるカウントが得られます。

正規表現に関する私のリファレンス:http://www.regular-expressions.info/

于 2012-12-03T16:18:48.270 に答える