2017-02-22 17 views
0

いくつかのコードを変換するための小さなツールを作成したいと思います。繰り返しC#Regex replace

ほとんどの場合、Regexで行うことができるので、実際のパーサーは必要ありません。

しかし、繰り返しパターンに問題があります。簡略化されたサンプルの下 :

var nl = Environment.NewLine; 
var temp = 
@"Other things 
End 
End 
Other things"; 

temp = Regex.Replace(temp, @"(\r\nEnd\r\n)+",@"" + nl + "}" + nl + ""); 

これには、第二の端部が

Other things 
} 
End 
Other things 

を交換していないが返されます。 (私は同じRegex.Replaceを2回実行する場合を除いて)

これを解決する方法はありますか?

お礼

+0

https://www.dotnetperls.com/regex正規表現の使い方を示しています。それは非常に速く、非常に興味深いです! – raBinn

+0

また、迅速なテスト用:https://regex101.com/ –

答えて

3

これは、一致が重複しないために発生します。あなたは接頭辞\r\nが既に捕捉されているので、正規表現は二\r\nEnd\r\nと一致することはできません

Other things***From Here***\r\n 
End\r\n***To Here*** 
End\r\n 
Other things 

と一致している

Other things\r\n 
End\r\n 
End\r\n 
Other things\r\n 

を持っています。

試してみてください。

temp = Regex.Replace(temp, @"(?<=\r\n)End(?=\r\n)+", "}"); 

使用非キャプチャあなたは問題を解決する(ただし、非キャプチャされ、あなたが(?<=)(?=)に一致したものを交換することはできませんのでご注意できる(?=)(?<=)をグループ化して、置換されたテキストの相違点"}"