C#正则表达式

C#正则表达式,c#,regex,C#,Regex,我有一个包含多个正则表达式组的字符串,以及该字符串中不在这些组中的某些部分。我需要替换一个字符,在本例中,仅在组中替换字符,而不是在字符串中不在正则表达式组中的部分 以下是输入字符串: startdontreplacement^ENDDONTREPLACEME~ startdontreplacement^endreplacement~ startdreplacement^BLAH^endreplacement~ startdontreplacement^BLAH^ENDDONTREPLACEME

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

以下是输入字符串:

startdontreplacement^ENDDONTREPLACEME~ startdontreplacement^endreplacement~ startdreplacement^BLAH^endreplacement~ startdontreplacement^BLAH^ENDDONTREPLACEME~

以下是输出字符串的外观:

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

我需要用C#来做,并且可以用正则表达式


我可以将字符串分为应该替换和不应该替换的组,但我正在努力解决如何返回最终输出字符串的问题。

如果您能够将应该替换的组和不应该替换的组分开,那么您应该能够使用MatchEvaluator,而不是提供单个替换字符串(获取匹配项并返回字符串的委托)来决定当前正在处理的情况,并仅返回该组的替换字符串

您还可以在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);
});

我不确定我是否完全了解您遇到的问题,但没过多久就得出了这个结果:

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 rgx = new Regex(
  @"\^(?=(?>(?:(?!(?:START|END)(?:DONT)?REPLACEME).)*)ENDREPLACEME)");

string s1 = rgx.Replace(s0, String.Empty);
说明:每次找到
^
时,先行扫描将查找结束分隔符(
ENDREPLACEME
)。如果先找到一个而没有看到任何其他分隔符,则匹配必须发生在REPLACEME组内。如果前瞻报告失败,则表示在组之间或在DONTREPLACEME组内找到了
^

因为lookahead是零宽度断言,所以在匹配成功的情况下,实际上只会使用
^


请注意,只有在分隔符始终保持正确平衡且组从未嵌套在其他组中时,此方法才会起作用。

愚人节?………..不,看起来很简单,但这张海报确实让人头疼。因此,海报不会出现在其他人身上。还是只有我?不完全是-此解决方案将删除“^BLAH^”之间的“BLAH”这应该被保留。只有^个字符应该被删除。好眼力-我错过了这个模式。是的。它删除了,~STARTREPLACEME^BLAH^ENDREPLACEME~,这是不应该的。你总是使用
Compiled
选项吗?这不是一个好主意。请检查:不,通常只有在创建我打算在上面使用的静态正则表达式实例时才这样做在这种情况下,我只想支付一次编译费用。如果这是一次性使用,我不会。你能给出我需要的没有lambda表达式的代码吗?我使用的是.NET 2.0。谢谢。谢谢你的回复。效果很好。不幸的是,为了从现实世界的问题中简化示例,我更改了标记。重新所有STARTREPLACEME的所有世界开始标记都是REFTC*,STARTREPLACEME可以是REF*TC之外的任何5个字母的组合。两个组都以字符~.Ideas结尾?因此两个标记的结束分隔符都是相同的:
~
?这会产生很大的不同。请尝试以下方法:
(?)?