2013-05-03 2 views
2

У меня проблема с Regex.Replace в 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 и работает точно так же, как и должно быть там.

EDIT:
К сожалению, скопировали неправильную версию функции. Теперь он показывает правильный код, который ведет себя неправильно для меня.

+1

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Привет, Джон, спасибо за ссылку. Я понял, поскольку он был специфичен для реализации регулярных выражений .NET, он должен быть там, но я понимаю и буду помнить об этом. – Derokorian

+0

Даже если он определен для .NET, он все равно не имеет ничего общего с C#. –

ответ

1

Это решило проблему, она также обрабатывает вложенные теги. Не уверен, почему, но перестройка снова и снова по-прежнему вызывает ошибки. Возможно, наш 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; 
} 
1

Выход я получаю совершенно отличается от того, что вы говорите, что вы получаете, но

Самая большая проблема, которую я вижу, что вы, вероятно, не хотите, чтобы регулярное выражение жадничать.

попытка не заменяя .* с .*?

+0

Да, несмотря на проблему с вопросом, возможно, это ответ. Однако тот факт, что вывод OP содержит второй '[b] [/ b]', говорит о том, что он не является жадным. Однако без использования реального регулярного выражения невозможно сказать, действительно ли данный вывод является подлинным или нет. – Chris

1

Нет необходимости Regex:

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(); 
} 
+0

И что произойдет, если у них есть несбалансированные теги на входе? Regex позволяет убедиться, что они всегда правильно сбалансированы. – Derokorian

+0

Извините, я удалил свой комментарий. То, что происходит, довольно очевидно. :) –

Смежные вопросы