我需要使用正则表达式(地址)C# 替换一些单词

I need to replace some words using regex (Address) C#

我需要替换以下文字:
“R”到“街道”
“R.”到“STREET”
“AV:”至“AVENIDA”

例如: "Garden test R. paraná" = "Garden 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);```               

如果您有一个包含搜索和替换值的字典,您可以从搜索字符串中动态构建一个正则表达式,并使用正则表达式查找字符串中的术语并使用相应的值替换为。

假设键总是以单词 char 开头,这里是处理具有可变结尾的术语的动态方法:

public static string CreateWb(string term)
{
    if (char.IsLetterOrDigit(term[term.Length-1]) || term[term.Length-1] == '_')
    {
        return $@"\b{Regex.Escape(term)}\b";
    }
    else
    {
        return $@"\b{Regex.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 组是否匹配,如果匹配,space 和这个单词 char 附加到替换结果(这是第 1 组键的字典值),否则,只有第 1 组键的字典值是返回。

可以在替换中使用带有命名匹配组的 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á;