[英]RegEx.Replace is only replacing first occurrence, need all
我在C#中遇到Regex.Replace
問題,因為它似乎無法取代所有出現的匹配模式。
private string ReplaceBBCode(string inStr)
{
var outStr = Regex.Replace(inStr, @"\[(b|i|u)\](.*?)\[/\1\]", @"<$1>$2</$1>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
outStr = Regex.Replace(outStr, "(\r|\n)+", "<br />");
return outStr;
}
輸入字符串:
[b]Saint Paul's Food Kitchen[/b] [b] [/b]Saint Paul's food kitchen opens weekly to provide food to those in need.
結果:
<b>Saint Paul's Food Kitchen</b> [b] [/b]Saint Paul's food kitchen opens weekly to provide food to those in need.
我已經在regexhero.net
中regexhero.net
進行了測試,它的工作原理與應該的一樣。
編輯:
抱歉,復制了該函數的錯誤版本。 現在,它顯示正確的代碼,對我而言,行為不正確。
我得到的輸出與您說的得到的完全不同,但是
我看到的最大問題是,您可能不希望您的正則表達式過於貪婪。
嘗試將.*
替換為.*?
無需正則表達式:
private static string ReplaceBBCode(string inStr)
{
return inStr.Replace("[b]", "<b>").Replace("[/b]", "</b>")
.Replace("[i]", "<i>").Replace("[/i]", "</i>")
.Replace("[u]", "<u>").Replace("[/u]", "</u>")
.Replace("\r\n", "\n")
.Replace("\n", "<br />");
}
我更喜歡這個:
private static string ReplaceBBCode(string inStr)
{
StringBuilder outStr = new StringBuilder();
bool addBR = false;
for(int i=0; i<inStr.Length; i++){
if (addBR){
outStr.Append("<br />");
addBR = false;
}
if (inStr[i] == '\r' || inStr[i] == '\n'){
if (!addBR)
addBR = true;
}
else {
addBR = false;
if (i+2 < inStr.Length && inStr[i] == '['
&& (inStr[i+1] == 'b' || inStr[i+1] == 'i' || inStr[i+1] == 'u')
&& inStr[i+2] == ']'){
outStr.Append("<").Append(inStr[i+1]).Append(">");
i+=2;
}
else if(i+3 < inStr.Length && inStr[i] == '[' && inStr[i+1] == '/'
&& (inStr[i+2] == 'b' || inStr[i+2] == 'i' || inStr[i+2] == 'u')
&& inStr[i+3] == ']'){
outStr.Append("</").Append(inStr[i+2]).Append(">");
i+=3;
}
else
outStr.Append(inStr[i]);
}
}
return outStr.ToString();
}
這解決了問題,它也處理嵌套標簽。 不知道為什么,但是一遍又一遍地重建仍然導致錯誤。 我們的VS2010可能已損壞,無法正確構建,或者框架已損壞。 不知道是什么原因造成的,但是這解決了它:
private string ReplaceBBCode(string inStr)
{
var outStr = inStr;
var bbre = new Regex(@"\[(b|i|u)\](.*?)\[/\1\]", RegexOptions.IgnoreCase | RegexOptions.Multiline);
while( bbre.IsMatch(outStr))
outStr = bbre.Replace(outStr, @"<$1>$2</$1>");
outStr = Regex.Replace(outStr, "(\r|\n)+", "<br />");
return outStr;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.