6

正規表現パターンでシンボルを使用して一致を見つけたいのですが、それらを置き換えたくありません。これは、C# でのクラスと名前空間の操作用です。

例えば:

MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests

次のように置き換える必要があります。

MyNamespaceLib.EntityDataModel.TestsMyClass+MyInnerClass

(注: "Tests" のみが名前空間部分の最後に表示される場合に置換され、クラス/名前空間名の一部である場合には置換されません)

一致を見つける際に最初の部分を正しく取得することができましたが、置換された一致でシンボルを維持するために戦っています。

これまでのところ、私は持っています:

var input = "MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests";

var output = Regex.Replace(input, "Tests[.+]|$", "");

非キャプチャ グループを使用してみましたが、使用しようとしている方法を意図したものではないと思われます。

ありがとう!

4

2 に答える 2

8

したがって、実行したいのは、aまたは?が後に続かない一致を置き換えることです。先読みを使用する:.+

@"Tests(?![.+])"
于 2012-12-24T22:46:35.980 に答える
1

Regex.ReplaceメソッドのMatchEvaluatorオーバーロードを使用できます。この場合、一致を置き換える文字列がその場で生成されます。キャプチャグループで特別な記号を取得し(最初のキャプチャグループは常に一致のグループ1です)、次のように一致を値に置き換えます。

var output = Regex.Replace(input, @"Tests([.+]|$)", m => m.Groups[1].Value);

また、minitechのコメントによると、次のように、Regex.Replaceの(文字列、文字列)オーバーロードの最初のキャプチャグループに$1を使用することもできます。

var output = Regex.Replace(input, @"Tests([.+]|$)", "$1");

とは言うものの、正規表現は書き込み専用のコードであることが多いため、いつでも馬鹿げた単純な置換を行うことができます。

var output = input.Replace("Tests+","").Replace("Tests.","") ...;
于 2012-12-24T22:49:27.053 に答える