1

次のような辞書(単語とその置換)があるとします。

var replacements = new Dictionary<string,string>();
replacements.Add("str", "string0");
replacements.Add("str1", "string1");
replacements.Add("str2", "string2");
...

および入力文字列として:

 string input = @"@str is a #str is a [str1] is a &str1 @str2 one test $str2 also [str]";

編集
期待される出力:

string0 is a string0 is string0 is string1 string2 one test string2

「 [CharSymbol]word」のすべての出現箇所を、辞書の対応するエントリ/値に置き換えたいです。

ここで、Charsymbolは @#$%^&*[] .. であり、単語が有効な後は ']' 、つまり [str] です。

交換のために次のことを試しました

string input = @"@str is a #str is a [str1] is a &str1 @str2 one test $str2 also [str]"; 
string pattern = @"(([@$&#\[]+)([a-zA-Z])*(\])*)"; // correct?
Regex re = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
// string outputString = re.Replace(input,"string0"); 
 string newString = re.Replace(input, match =>   
         {  
             Debug.WriteLine(match.ToString()); // match is [str] #str 
             string lookup = "~"; // default value
             replacements.TryGetValue(match.Value,out lookup);
             return lookup;
         });

str 、 str1 などとして一致を取得するにはどうすればよいですか。つまり、charsymbol のない単語です。

4

3 に答える 3

1

正規表現を次のように変更します。

// Move the * inside the brackets around [a-zA-Z]
// Change [a-zA-Z] to \w, to include digits.
string pattern = @"(([@$&#\[]+)(\w*)(\])*)";

この行を変更します。

replacements.TryGetValue(match.Value,out lookup);

これに:

replacements.TryGetValue(match.Groups[3].Value,out lookup);

注:IgnoreCase正規表現では大文字と小文字の両方が一致するため、あなたは必要ありません。

于 2012-08-02T15:51:29.447 に答える
1

これは合っていますか?

(?<=[#@&$])(\w+)|[[\w+]]

あなたの例では、次のように一致します。

@ stris a # stris a [ str] is a & str1@ str2one test $str2

于 2012-08-02T12:04:38.837 に答える
1

これを試してくださいRegex:([@$&#\[])[a-zA-Z]*(\])?と置き換えますstring0

コードは次のようになります。

var replacements = new Dictionary<string, string>
                        {
                            {"str", "string0"},
                            {"str1", "string1"},
                            {"str2", "string2"}
                        };

String input="@str is a #str is a [str] is a &str @str can be done $str is @str";

foreach (var replacement in replacements)
{
    string pattern = String.Format(@"([@$&#\[]){0}(\])?", replacement.Key);
    var re = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
    string output = re.Replace(input, 
                               String.Format("{0}", replacement.Value)); 
} 
于 2012-08-02T12:04:40.337 に答える