簡體   English   中英

C#正則表達式

[英]C# Regular Expressions

我有一個包含多個正則表達式組的字符串,以及不在組中的字符串的某些部分。 我需要替換一個字符,在這種情況下^僅在組內,而不是在字符串中不在正則表達式組中的部分。

這是輸入字符串:

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

這是輸出字符串應該是什么樣子:

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

我需要使用C#來完成它並且可以使用正則表達式。

我可以將字符串匹配到那些應該和不應該被替換的組中,但我正在努力研究如何返回最終的輸出字符串。

我不確定我到底遇到了什么問題,但是沒過多久就得出這個結果:

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/

這有用嗎?

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

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

說明:每次找到^ ,前瞻掃描前方的結束分隔符( ENDREPLACEME )。 如果它找到一個沒有首先看到任何其他分隔符,則匹配必須發生在REPLACEME組內。 如果前瞻報告失敗,則表示在組之間或DONTREPLACEME組內找到了^

因為前瞻是零寬度斷言,所以在成功匹配的情況下實際上只會消耗^

請注意,只有在分隔符始終正確平衡且組永遠不會嵌套在其他組中時,這才有效。

如果你能夠分成應該被替換的組和那些不應該被替換的組,那么你應該能夠使用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);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM