禁用正则表达式的全局
本文关键字:全局 正则表达式 | 更新日期: 2023-09-27 18:36:51
我想关闭全局设置(因为它默认设置为在 .NET 上使用),因为我尝试做的只需要更改字符串的第一部分,但是有可能它会在字符串中出现两次,例如我希望
C00000WPF0000SAND
仅更改 0 的第一个实例。
if (Regex.IsMatch(text, "^[a-z]+00+", RegexOptions.IgnoreCase))
{
text = Regex.Replace(text, "0{1,}", "00*", RegexOptions.IgnoreCase);
}
这就是我目前的做法,但是这似乎采用了"00+"的每个实例并对其进行了更改,但这会使事情变得混乱。
您需要指定匹配限制;Regex.Replace(string, string, RegexOptions)
的文档明确指出它替换了找到的模式的所有实例。 没有同时采用匹配限制和正则表达式选项的Regex.Replace
的静态重载,因此您必须构造一个正则表达式对象,然后使用Replace(string, string, int)
重载。 试试这个:
text = new Regex("0{1,}", RegexOptions.IgnoreCase).Replace(text, "00*", 1);
您可以稍微更改正则表达式,使其与预期的模式匹配,并且仅替换第一组零。这也有助于减少IsMatch
电话。
您可以使用的模式是:(?<=^[a-z]+)00+
此模式与第一个模式类似,只是它使用后看 (?<=^[a-z]+)
来确保匹配在带有字母的字符串开头按预期进行。后视的用法将匹配,但不会消耗,因此替换不会影响字符串的该部分。
string text = "C00000WPF0000SAND";
text = Regex.Replace(text, "(?<=^[a-z]+)00+", "00*", RegexOptions.IgnoreCase);
Console.WriteLine(text);
另一种解决方案是:
text = Regex.Replace(text, "(?i)^([a-z]+)00+", "${1}00*");
在这种情况下,您根本不需要if
。