首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用Global

禁用Global
EN

Stack Overflow用户
提问于 2012-06-11 12:48:51
回答 3查看 2.3K关注 0票数 2

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

C00000WPF0000SAND

只更改0的第一个实例。

代码语言:javascript
复制
if (Regex.IsMatch(text, "^[a-z]+00+", RegexOptions.IgnoreCase))
{
    text = Regex.Replace(text, "0{1,}", "00*", RegexOptions.IgnoreCase);
}

这就是我目前正在做的事情,然而,这似乎是对"00+“的每一个实例进行修改,但这会使事情变得一团糟。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-11 12:53:19

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

代码语言:javascript
复制
text = new Regex("0{1,}", RegexOptions.IgnoreCase).Replace(text, "00*", 1);
票数 5
EN

Stack Overflow用户

发布于 2012-06-11 12:58:04

您可以稍微修改正则表达式,使其与预期的模式匹配,并且只替换第一组零。这也有助于减少IsMatch调用。

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

这个模式类似于第一个模式,只不过它使用了一个回顾性的(?<=^[a-z]+),以确保匹配发生在字符串开头的字母中。后置的用法将匹配,但不会消耗,因此替换不会影响字符串的这一部分。

代码语言:javascript
复制
string text = "C00000WPF0000SAND";
text = Regex.Replace(text, "(?<=^[a-z]+)00+", "00*", RegexOptions.IgnoreCase);
Console.WriteLine(text);
票数 2
EN

Stack Overflow用户

发布于 2012-06-11 13:10:03

另一个解决办法是:

代码语言:javascript
复制
text = Regex.Replace(text, "(?i)^([a-z]+)00+", "${1}00*");

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10980418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档