C#正则表达式

时间:2011-04-02 01:22:22

标签: c# regex

我有一个包含多个正则表达式组的字符串,以及不在组中的字符串的某些部分。我需要替换一个字符,在这种情况下^仅在组内,而不是在字符串中不在正则表达式组中的部分。

这是输入字符串:

STARTDONTREPLACEME^ENDDONTREPLACEME~STARTREPLACEME^ENDREPLACEME~STARTREPLACEME^BLAH^ENDREPLACEME~STARTDONTREPLACEME^BLAH^ENDDONTREPLACEME~

这是输出字符串的样子:

STARTDONTREPLACEME^ENDDONTREPLACEME~STARTREPLACEMEENDREPLACEME~STARTREPLACEMEBLAHENDREPLACEME~STARTDONTREPLACEME^BLAH^ENDDONTREPLACEME~

我需要使用C#来完成它并且可以使用正则表达式。

我可以将字符串与那些应该和不应该替换的字符串进行匹配,但我正在努力研究如何返回最终的输出字符串。

3 个答案:

答案 0 :(得分:1)

我不确定我到底遇到了什么问题,但没想多久就得出这个结果:

string strRegex = @"STARTREPLACEME(.+)ENDREPLACEME";
RegexOptions myRegexOptions = RegexOptions.None;
Regex myRegex = new Regex(strRegex, myRegexOptions);
string strTargetString = @"STARTDONTREPLACEME^ENDDONTREPLACEME~STARTREPLACEME^ENDREPLACEME~STARTREPLACEME^BLAH^ENDREPLACEME~STARTDONTREPLACEME^BLAH^ENDDONTREPLACEME~";
string strReplace = "STARTREPLACEMEENDREPLACEME";

return myRegex.Replace(strTargetString, strReplace);

使用我最喜欢的在线Regex工具:http://regexhero.net/tester/

这有用吗?

答案 1 :(得分:1)

Regex rgx = new Regex(
  @"\^(?=(?>(?:(?!(?:START|END)(?:DONT)?REPLACEME).)*)ENDREPLACEME)");

string s1 = rgx.Replace(s0, String.Empty);

说明:每次找到^时,前瞻会向前扫描结束分隔符(ENDREPLACEME)。如果它找到一个没有首先看到任何其他分隔符,则匹配必须发生在REPLACEME组内。如果前瞻报告失败,则表示在组之间或DONTREPLACEME组内找到了^

因为前瞻是零宽度断言,所以在匹配成功的情况下,实际上只会消耗^

请注意,只有当分隔符始终正确平衡且从不嵌套在其他组中时,此方法才有效。

答案 2 :(得分:0)

如果你能够分成应该被替换的组和不应该被替换的组,那么你应该能够使用MatchEvaluator(一个获取Match并返回一个字符串的委托),而不是提供一个替换字符串。 )决定它当前处理的是哪种情况,并单独返回该组的替换字符串。

您还可以在MatchEvaluator中使用其他正则表达式。该解决方案产生预期的输出:

Regex outer = new Regex(@"STARTREPLACEME.+ENDREPLACEME", RegexOptions.Compiled);
Regex inner = new Regex(@"\^", RegexOptions.Compiled);

string replaced = outer.Replace(start, m =>
{
    return inner.Replace(m.Value, String.Empty);
});