【问题标题】:I need to replace some words using regex (Address) C#我需要使用 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
  • 只包含一个

标签: c# regex replace expression


【解决方案1】:

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

假设键始终以单词 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 是否匹配, 如果是,则将空格和这个单词 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á;

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 2015-12-07
    • 1970-01-01
    • 2018-06-09
    • 2012-05-07
    • 2012-10-16
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多