我需要使用 regex (Address) C# 替换一些单词
Posted
技术标签:
【中文标题】我需要使用 regex (Address) C# 替换一些单词【英文标题】:I need to replace some words using regex (Address) C# 【发布时间】:2021-08-19 16:58:16 【问题描述】:我需要替换以下单词:“R”到“RUA”,“R.”到“RUA”,“AV:”到“AVENIDA”
例如: "Jardim test R. paraná" = "Jardim test Rua paraná" "R. paraná" = "Rua paraná" "R xavier" = "Rua xavier"
我尝试了以下表达式,但它不起作用:
string pattern = @"\bR\.\b";
string replace = "RUA";
logradouro = Regex.Replace(logradouro, pattern, replace, RegexOptions.IgnoreCase);```
【问题讨论】:
我无法使用替换功能:.Replace ("R ", "Rua ") "R Xavier" => "Rua Xavierua" 错误 您的字符串是否可能包含多个单词,例如:Jardim test R. paraná R
?
只包含一个
【参考方案1】:
如果您有一个带有搜索和替换值的字典,您可以从搜索字符串动态构建一个正则表达式,并使用该正则表达式查找字符串中的术语并使用相应的值进行替换。
假设键始终以单词 char 开头,这是一种处理具有可变结尾的术语的动态方法:
public static string CreateWb(string term)
if (char.IsLetterOrDigit(term[term.Length-1]) || term[term.Length-1] == '_')
return $@"\bRegex.Escape(term)\b";
else
return $@"\bRegex.Escape(term)";
然后就可以使用了
var dct = new Dictionary<string, string>();
dct.Add("R", "RUA");
dct.Add("R.", "RUA");
dct.Add("AV:", "AVENIDA");
var pat = $@"(string.Join("|", dct.Keys.Select(k => CreateWb(k)).OrderByDescending(x => x.Length)))\W*(\w)?";
var input ="Jardim test R. paraná R. paraná R xavier AV:test AV:VEREADOR HOMERO FRANCO";
var output = Regex.Replace(input, pat, m =>
$"dct[m.Groups[1].Value]" + (m.Groups[2].Success ? $" m.Groups[2].Value" : ""),
RegexOptions.IgnoreCase);
Console.WriteLine(output);
// => Jardim test RUA paraná RUA paraná RUA xavier AVENIDA test AVENIDA VEREADOR HOMERO FRANCO
见C# demo
注意(?:term_regex_1|term_regex_2|term_regex_N)\W*(\w)?
正则表达式末尾的\W*(\w)?
匹配零个或多个非单词字符,然后匹配将其捕获到组2 中的可选单词字符。在匹配评估器部分,我们检查组2 是否匹配, 如果是,则将空格和这个单词 char 附加到替换结果(即具有 Group 1 键的字典值),否则仅返回具有 Group 1 键的字典值。
【讨论】:
@RenathuCazari 注意我写这个是假设搜索字符串后面总是跟一个非单词字符。如果AV:
或R.
可以粘贴到下一个单词(如AV:WORD
),则此解决方案将需要更新。如果是这样,请告诉我。
是的,它可以发生 例如:Av:test => "Avenida test"
@RenathuCazari 立即查看。注意我假设搜索词总是以单词 char 开头。如果下一个字符是单词字符,则在匹配后添加空格,否则不添加空格。
错误:“AV:VEREADOR HOMERO FRANCO”-->“AVENIDA:VEREADOR HOMERO FRANCO”
@RenathuCazari 错误是什么?它可以按您的预期工作。如果您想用AVENIDA:
替换AV:
,只需将其添加为:
。见ideone.com/ciqlMl【参考方案2】:
可以在替换中使用带有命名匹配组的MatchEvaluator
,例如:
Regex.Replace("Jardim test R. av: paraná",
@"\b((?<Rua>[Rr.]+)|(?<Avienda>[AaVv:]2,3))",
m => return m.Groups["Avienda"].Success ? "AVIENIDA" : "RUA";);
结果是Jardim test RUA AVIENIDA paraná
;
【讨论】:
以上是关于我需要使用 regex (Address) C# 替换一些单词的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 regex.match 在 c# 中提取字符串的特定部分? [复制]