我在C#上使用带有WinForms的.NET 2.0。我正在使用正则表达式的一个大问题。我正在尝试在一个简单的字符串中为4个或更多字母单词添加冒号。它应该只添加冒号一次,之后代码不应再附加。
Regex lbls = new Regex(@"^\s*(?<lbl>[A-Za-z0-9_]{4,})", RegexOptions.Multiline); // Use a regex to obtain all 4 letter words in string
MatchCollection matches = lbls.Matches(text); // text is my string
foreach (Match m in matches)
{
string mm = m.Groups["lbl"].Value; // Matches are stored in this group.
if (!Regex.IsMatch(text, @"^\s*\b" + mm + @":\b", RegexOptions.Multiline))
{
text = Regex.Replace(text, @"\b" + mm + @"\b", mm + ":", RegexOptions.Multiline);
}
}
假设字符串是“TEST”。这意味着输出应该是“TEST:”。但是,如果再次运行代码,则文本应保持“TEST:”但不是,而是“TEST ::”。冒号继续添加。为什么是这样?我的if语句看起来完全正确。
答案 0 :(得分:2)
尝试将^([A-Za-z0-9_]{4})(?!:)
替换为$1:
,其中$1
是第一组。
答案 1 :(得分:1)
第一次运行代码时,您在输入中搜索值“TEST”(简称为“TEST”)并将其替换为“TEST”并在末尾添加冒号。
所以在第一次迭代之后,结果将是“TEST:”。
第二次运行代码时,您在输入中搜索值“TEST”(现在是“TEST:”)并将其替换为“TEST”并在末尾添加冒号。
所以在第二次迭代之后,结果将是“TEST ::”。
似乎你只想在没有冒号的情况下(或许没有冒号)将冒号追加到最后。
尝试改变你“if”与此相符......
if ( !Regex.IsMatch( text , @"\b" + mm + @"\b:" , RegexOptions.Multiline ) )