我在替换特定字符后的字符时遇到问题。例如,我想用此代码将第一个'aa'替换为'33'。
string str = "dc1aaaafg";
string pattern = @"a{2}(?!(1))";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(str, "33");
但结果是'dc13333fg'。它在'1'之后取代了第二组。我只需要替换像'dc133aafg'这样的第一组。我怎么能做到这一点。我有一个大字符串,它可以很多替换,这只是一个例子。
答案 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
)