首页 > 解决方案 > 如何仅使用一个正则表达式将多个字符串替换为另一个字符串,还是必须使用多个正则表达式和临时字符串?

问题描述

我有一个变量被赋予这样的值:

vm.WordType = phrase.WordType;

其中phrase.WordType 的值可以是这样的:

"Godan verb with ru ending, Transitive Verb"

我想把它改成

"Godan v with ru end, Transitive v"

例如,我可以使用正则表达式将动词替换为 v,但有没有办法可以使用正则表达式进行更多替换,例如将“结尾”替换为“结束”,或者我是否必须以某种方式将多个正则表达式串在一起并使用临时变量?

vm.WordType = Regex.Replace(phrase.WordType, "verb", "v", RegexOptions.IgnoreCase);

标签: c#regex

解决方案


您当然可以只调用Regex.Replace2 次 - 第一次替换“动词”,第二次替换“结尾”。

如果你不喜欢这样,你可以像这样在一个正则表达式中做到这一点:

Regex.Replace("Godan verb with ru ending, Transitive Verb", "(v)erb|(end)ing", "$1$2", RegexOptions.IgnoreCase)

我在这里使用的正则表达式是:

(v)erb|(end)ing

它匹配“动词”并将“v”放入第 1 组,或者匹配“结尾”并将“结束”放入第 2 组。

替换为$1$2,表示第 1 组和第 2 组。

假设您还想用“trans”替换“transitive”,您可以轻松地将正则表达式更改为:

(v)erb|(end)ing|(trans)itive

并替换所有三个组:

$1$2$3

请注意,这种方法将保留大小写,因此“动词”变为“V”,“动词”变为“v”。如果这是不可取的,您可以传入 aMatchEvaluator将它们转换为小写:

Regex.Replace(
            "Godan verb with ru ending, Transitive Verb", 
            "(v)erb|(end)ing",
            x => string.Join("", x.Groups.Cast<Group>().Skip(1).Select(y => y.Value)).ToLowerInvariant(),
            RegexOptions.IgnoreCase)

推荐阅读