C#正则表达否定前瞻

时间:2013-10-16 15:26:28

标签: c# regex

我在替换特定字符后的字符时遇到问题。例如,我想用此代码将第一个'aa'替换为'33'。

 string str = "dc1aaaafg";
 string pattern = @"a{2}(?!(1))";
 Regex rgx = new Regex(pattern);
 string result = rgx.Replace(str, "33");

但结果是'dc13333fg'。它在'1'之后取代了第二组。我只需要替换像'dc133aafg'这样的第一组。我怎么能做到这一点。我有一个大字符串,它可以很多替换,这只是一个例子。

4 个答案:

答案 0 :(得分:4)

Regex.Replace()是全球性的。它将替换模式与 * 匹配的次数。

您可以使用Regex.Replace(String, String, Int32)来限制操作次数。

string result = rgx.Replace(str, "33", 1);

或者您将模式更改为后视。

Regex rgx = new Regex(@"(?<=1)a{2}");
string result = rgx.Replace(str, "33");

* 请注意,Replace() 全球,但不是增量。使用a{2}上的"aaaaaa"表达式替换"ba"将导致"bababa",而不是"bbbbba"

答案 1 :(得分:1)

Replace方法存在重载,您可以在其中指定次数。指定1,它只能进行第一次匹配。

string result = rgx.Replace(str, "33", 1);

答案 2 :(得分:0)

正则表达式模式无法表示只有第一个匹配是相关的。

使用Regex.Match获取第一场比赛的位置和长度。然后使用Substring(或Remove后跟Insert)从旧字符串构造一个新字符串,该字符串包含您想要的替换字符。

答案 3 :(得分:0)

尝试使用负面看法:(a{2})(?<!\1{2})

(a{2}) # 'a' two times
(?<! # negative look behind
 \1{2} # '\1' is the captured group 'a' twice to "jump" over the captured group
)