2012-12-24 16 views
5

RegExパターンのシンボルを使用して一致を検索したいが、置換したくない。これは、C#でのクラスと名前空間の操作用です。例えばRegEx - シンボルを使用して一致させるが置き換えない

:(注、唯一の "テスト" は、それが表示されたら取り替えるある

MyNamespaceLib.EntityDataModel.TestsMyClass+MyInnerClass

MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests

のように交換する必要があります最後に

私はマッチを見つけるのに最初の部分を取得することができましたが、置き換えられたマッチにシンボルを保持するために戦っています。

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

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

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

を私は非キャプチャグループを使用してみましたが、私はそれが私が道のためのものではないだ疑いそれを使用しようとしています。

ありがとうございます!

答えて

6

だから、でなく、.または+と置き換えてください。 lookaheadを使用します。

@"Tests(?![.+])" 
+0

いいえ、反対ですが、本質的に "。"、 "+"または行末で終わるマッチを置き換えたいと思います。しかし、単語 "Tests"が名前空間またはクラス名の中に現れた場合、それは置き換えられてはなりません。 – Steve

+0

@ user1927385: 'テスト(?![^。+])'、その後。 – Ryan

+0

ニース、それは完璧に機能しました。 Regexで先読みを使ったことは一度もなかったので、もう少し詳しく読んでみましょう。ありがとうございましたminitech。 – Steve

1

あなたはとの一致を置き換えるための文字列をオンザフライで生成されたRegex.Replace方法、のMatchEvaluatorオーバーロードを使用することができます。あなたができる、

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

また、minitechさんのコメントあたり:私はこのように、(そして最初のキャプチャグループは、常に試合のグループ1です)キャプチャグループに特別なsimbolを取得し、その値との一致を置き換えますまた同様に、Regex.Replaceの(文字列、文字列)過負荷に最初のキャプチャグループ$ 1を使用する:あなたがダムを行う常にことができますので、言っ

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

、正規表現が頻繁にされて書き込み専用コードと単純交換:

var output = input.Replace("Tests+","").Replace("Tests.","") ...; 
+0

うん、うまくいくでしょう、私は1つのRegExパターンですべてを完了しようとしていました。私はそれを働かせることができない場合、これは最後です。 – Steve

+0

はい、これは[this Regex.Replace overload](http://msdn.microsoft.com/en-us/library/cft8645c.aspx)で行われていますので、少し前に例を挙げてお試しください。 – SWeko

+0

何かをグループの値で置き換えたいなら、それを文字列の中で行うことができます: 'Regex.Replace(...、" $ 1 ")' – Ryan

関連する問題