正则表达式将“ABC42”替换为“Douglas”,但保留ABC421或ABC4244

时间:2014-02-27 03:09:17

标签: c# regex

好吧标题说明了一切......

我有一个文件,其中包含相同字符串的不同风格,后跟不同的整数。假设我有几次ABC42,一些ABC422和一个ABC4244。

我想用“道格拉斯”取代“ABC42”,并保持文本中的ABS422和ABC4244完好无损。

我正在使用.Net正则表达式解析器。

提前致谢

2 个答案:

答案 0 :(得分:3)

您可以使用字边界(\b元字符)来准确匹配目标文本。您的模式将是:\bABC42\b

string input = " Let's say I have ABC42 a couple of times, a few ABC422 and one ABC4244.";
string pattern = @"\bABC42\b";
string result = Regex.Replace(input, pattern, "Douglas");

编辑:回应评论询问这是否适用于“zzABC42 _”...

在这种情况下不起作用,因为使用\b的整个要点是匹配单词边界。由于该模式使用\b围绕“ABC42”,因此它与整个单词相匹配。要匹配“zzABC42_”,我们不能再使用字边界了。

相反,我们需要部分匹配它并提出新标准。假设此条件部分匹配“ABC42”,只要“42”之后没有其他数字。我可以删除\b并使用负向预测来防止匹配额外的数字。这类似于以下模式:ABC42(?!\d)

string input = "Hello zzABC42_, ABC422 and ABC4244.";
string pattern = @"ABC42(?!\d)";
string result = Regex.Replace(input, pattern, "Douglas");

答案 1 :(得分:2)

您可以使用以下代码,前提是ABC42本身就是一个单词(下面的正则表达式基于单词边界匹配)。

String input = "ABC42 a couple of times, a few ABC422 and one ABC4244 ABC42.";
String pattern = @"\bABC42\b";

String output = Regex.Replace(input, pattern, "Douglas");