2017-06-30 3 views
-1

私はPowerShellをよく知っていて、最近は主な言語としてC#を使用するようになりました。 PowerShellでは、次のことが可能です。C#変数を使った正規表現のマッチング

$var1 = "abc" 
"abc" -match "$var1" 

この結果、真のステートメントになります。

私はC#で同じことをすることができるようにしたいと思います。私はあなたがC#で補間を使うことができることを知っていますし、Regex.Match()を無駄なく使用しようとするさまざまな方法を試しています。

例:

string toMatch = "abc"; 

var result = Regex.Match("abc", $"{{toMatch}}"); 
var a = Regex.Match("abc", $"{{{toMatch}}}"); 
var b = Regex.Match("abc", $"{toMatch}"); 
var c = Regex.Match(toMatch,toMatch); 

上記のどれも動いていないようにみえ。私がしようとしていることがC#で可能であるかどうかはわかりません。理想的には、私は一致のための変数とRegexの組み合わせを使用できるようにしたいと思います。このようなものも同じですRegex.Match(varToMatch,$"{{myVar}}\\d+\\w{4}")

編集: ここでいくつかの解答を読み、いくつかのコードを試してみたら、私の本当の問題はディレクトリパスと一致しているようです。 "C:\ temp \ abcfile"のようなものです。たとえば:

string path = @"C:\temp\abc"; 
      string path2 = @"C:\temp\abc"; 
      string fn = path.Split('\\').LastOrDefault(); 

      path = Regex.Escape(path); 
      path2 = Regex.Escape(path2); 

      Regex rx = new Regex(path); 

      var a = Regex.Match(path.Split('\\').Last().ToString(), $"{fn}"); 
//Example A works if I split and match on just the file name. 

      var b = Regex.Match(path, $"{rx}"); 
//Example B does not work, even though it's a regex object. 
      var c = Regex.Match(path, $"{{path}}"); 
//Example C I've tried one, two, and three sets of parenthesis with no luck 
      var d = Regex.Match(path,path); 
// Even a direct variable to variable match returns 0 results. 
+0

あなたのコードは正常に動作します(ただし、余分な括弧を追加しない場合のみ)。何が問題なの? – SLaks

+0

あなたは 'Regex.Escape'が必要です。 – SLaks

+0

二重エスケープバックスラッシュの代わりに '$ @'を使用してください。 – SLaks

答えて

1

あなたは右の最後の例では、それを持っているように見えるので、おそらく問題は、あなたの代わりにMatch結果のブール結果を期待しているということでしょうか?

うまくいけば、この小さな例は、役立ちます:

int a = 123; 
string b = "abc"; 
string toMatch = "123 and abc"; 

var result = Regex.Match(toMatch, $"{a}.*{b}"); 

if (result.Success) 
{ 
    Console.WriteLine("Found a match!"); 
} 
+0

あなたの例は素晴らしいです。たぶん、私の最終目標は2つのディレクトリパスにマッチしているので、私が抱えている問題はエスケープ文字です。 Regex.Escape()を使用しても、うまく動作していないようです。 –

+1

ああ、大丈夫です。それを反映するために質問を更新する必要があります! –

関連する問題