我需要使用 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# 替换一些单词的主要内容,如果未能解决你的问题,请参考以下文章

java.util.regex 的 C# 等价物是啥?

如何使用 regex.match 在 c# 中提取字符串的特定部分? [复制]

解析变量 URI (RegEx, Uri, String-Functions?) c#

从 div 标签中提取内容 C# RegEx

Java Regex match IP address

C# Regex类用法