我有一个包含多个正则表达式组的字符串,以及不在组中的字符串的某些部分。我需要替换一个字符,在这种情况下^
仅在组内,而不是在字符串中不在正则表达式组中的部分。
这是输入字符串:
STARTDONTREPLACEME^ENDDONTREPLACEME~STARTREPLACEME^ENDREPLACEME~STARTREPLACEME^BLAH^ENDREPLACEME~STARTDONTREPLACEME^BLAH^ENDDONTREPLACEME~
这是输出字符串的样子:
STARTDONTREPLACEME^ENDDONTREPLACEME~STARTREPLACEMEENDREPLACEME~STARTREPLACEMEBLAHENDREPLACEME~STARTDONTREPLACEME^BLAH^ENDDONTREPLACEME~
我需要使用C#来完成它并且可以使用正则表达式。
我可以将字符串与那些应该和不应该替换的字符串进行匹配,但我正在努力研究如何返回最终的输出字符串。
答案 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);
});