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