C# 根据匹配情况,用单独的替换替换正则表达式

C# 根据匹配情况,用单独的替换替换正则表达式,c#,regex,replace,pattern-matching,C#,Regex,Replace,Pattern Matching,假设我有一本字典(word及其替代品),如下所示: 编辑: 预期产出: 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] i

假设我有一本字典(word及其替代品),如下所示:

编辑
预期产出:

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等匹配项,即不带字符符号的单词。

适合吗

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

(?试试这个
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)); 
} 
var replacements=新字典
{
{“str”,“string0”},
{“str1”,“string1”},
{“str2”,“string2”}
};
String input=“@str是a#str是a[str]是a&str@str可以完成$str是@str”;
foreach(替换中的var替换)
{
字符串模式=string.Format(@“([@$&\[]){0}(\])?”,replacement.Key);
var re=新正则表达式(模式,RegexOptions.IgnoreCase | RegexOptions.Compiled);
字符串输出=重新替换(输入,
格式(“{0}”,replacement.Value));
} 

将正则表达式更改为:

// 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
是不必要的,因为您匹配正则表达式中的大小写。

sorry不适用于问题中的输入字符串。即。“@str是a#str是a[str1]是&str1@str2一个测试$str2也是[str]”不抱歉没有按预期工作。我已经更新了问题以显示我是如何匹配/替换的。没有。现在它给出了“string0是string0是string0是string0是str1]是Strr2 string0是Strr2”我错过了[a-zA-Z]不匹配数字的事实。我已经更新了答案。
replacements.TryGetValue(match.Value,out lookup);
replacements.TryGetValue(match.Groups[3].Value,out lookup);