2

我在特定字符后替换字符时遇到问题。例如,我想用此代码将第一个 '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

4 回答 4

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}on "aaaaaa"to 与替换一起使用"ba"将导致"bababa",而不是 in "bbbbba"

于 2013-10-16T15:32:57.940 回答
1

该方法有一个重载Replace,您可以在其中指定次数。指定 1 并且它应该只做第一个匹配。

string result = rgx.Replace(str, "33", 1);
于 2013-10-16T15:30:44.007 回答
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
)
于 2013-10-16T15:37:28.667 回答
0

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

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

于 2013-10-16T15:30:09.407 回答