1

我想关闭全局设置(因为它被设置为在.NET上使用的默认设置)因为我想要做的只需要更改字符串的第一部分,但是它有可能会发生两次在字符串中,例如我希望

C00000WPF0000SAND

仅更改 0 的第一个实例。

if (Regex.IsMatch(text, "^[a-z]+00+", RegexOptions.IgnoreCase))
{
    text = Regex.Replace(text, "0{1,}", "00*", RegexOptions.IgnoreCase);
}

这就是我目前正在这样做的方式,但是这似乎需要“00+”的每个实例并对其进行更改,但这会使事情变得混乱。

4

3 回答 3

4

您需要指定匹配限制;的文档Regex.Replace(string, string, RegexOptions)特别声明它替换了找到的模式的所有实例。没有静态重载Regex.Replace需要匹配限制和正则表达式选项,因此您必须构造一个正则表达式对象,然后使用Replace(string, string, int)重载。试试这个:

text = new Regex("0{1,}", RegexOptions.IgnoreCase).Replace(text, "00*", 1);
于 2012-06-11T12:53:19.653 回答
2

您可以稍微更改您的正则表达式,使其与预期模式匹配并且仅替换第一组零。这也有助于切断IsMatch通话。

您可以使用的模式是:(?<=^[a-z]+)00+

此模式与您的第一个模式相似,只是它使用后视(?<=^[a-z]+),来确保匹配在带有字母的字符串的开头按预期发生。后视的使用将匹配,但不会消耗,因此替换不会影响字符串的该部分。

string text = "C00000WPF0000SAND";
text = Regex.Replace(text, "(?<=^[a-z]+)00+", "00*", RegexOptions.IgnoreCase);
Console.WriteLine(text);
于 2012-06-11T12:58:04.270 回答
0

另一种解决方案是:

text = Regex.Replace(text, "(?i)^([a-z]+)00+", "${1}00*");

在这种情况下,您根本不需要if

于 2012-06-11T13:10:03.190 回答