2016-04-28 9 views
-1

c#はInterpolated stringsです。私は、文字列は、例えば、入力のリストにして許可され、SPILされていることを、確認する必要があります補間された文字列の正規表現を作成する方法

Variable + "Text {NotVariable}" 

"{Variable} Text \{NotVariable\}" 

に対応しています。これは、この文字列があることを意味します。変数と "Text {NotVaraible}"となります。

男も同様の質問を投稿しましたが、私のニーズに合わせて回答を変更することはできません。 Link to similar problem

誰もがプロップソリューションを持っていますか?

+0

あなたは文字列 '{変数} \"テキスト\ {NotVariable \} \ ""を処理しなければならないということですか? –

+0

"{Variable} Text \ {NotVariable \}"という文字列を2つの異なる文字列に変換する必要があります。 – user3265569

+0

まあ、補間された文字列で '{'と '}をエスケープすると、それらを倍加することを意味します。したがって、この例は '$" {Variable} \ "Text \" {{NotVariable}} "'を読み、 'Variable +" \ "Text \" {{NotVariable}} "'に変換する必要があります。 –

答えて

1

あなたはfollowing regexを試してみてください:

(?s)(?<bndr>\$"|(?!^)\G)  # Get the start of the interpolated string literal or the end of previous match 
(?: 
(?<var>{[^}]*})    # Match a variable {non-braces-inside} 
|       # OR... 
(?<literal>(?:\\.|{{|}}|[^"\\{}])*) # Escaped entities or everything else 
) 

は、このC#のデモの結果を参照してください:入社matchescheck_string(実際の補間された文字列)の出力から構築されてい

var Variable = ""; 
var input_text = "$\"text1 {Variable} \\\"Text\\\" {{NotVariable}}\""; 
var pat = @"(?s)(?<bndr>\$""|(?!^)\G)(?:(?<var>{[^}]*})|(?<literal>(?:\\.|{{|}}|[^""\\{}])*))"; 
var matches = Regex.Matches(input_text, pat) 
    .Cast<Match>() 
    .Select(p => p.Groups["var"].Success ? p.Groups["var"].Value.Trim(' ', '{', '}') : "\"" + p.Groups["literal"].Value.Replace("{{", "{").Replace("}}", "}") + "\"") 
    .ToList(); 
matches.RemoveAll(p => p == "\"\""); 
Console.WriteLine(string.Join(" + ", matches));        //"text1 " + Variable + " \"Text\" {NotVariable}" 
var result_string = "text1 " + Variable + " \"Text\" {NotVariable}" + ""; //text1 "Text" {NotVariable} 
var check_string = $"text1 {Variable} \"Text\" {{NotVariable}}";   //text1 "Text" {NotVariable} 

result_stringが等しいです。

関連する問題