2009-09-15 5 views
0

Я попытался заменить   элементы в строку, используя регулярное выражение .NET - не повезло :)Regex заменить строку

Предположим следующую строку:

 AA A  C D   A Some Text   here

Правила,

  1. Не заменять в начале строки
  2. Заменить только отдельные случаи
  3. Не заменять, если пространство до или после него (по желанию)

Желаемый результат из выше (#, как символ замены):

 AA#A  C#D   A#Some Text   here

ответ

2

Это должно охватывать все 3 из ваших требований. Извините за форматирование; Я должен был отменить первые несколько строк для  , чтобы правильно отобразиться.

string pattern = @"(?<!^|&nbsp;)((?<!\s)&nbsp;(?!\s))(?!\1)";

string[] inputs = { "&nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A&nbsp;Some Text &nbsp; here", // original

"&nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A &nbsp;Some Text &nbsp; here" // space before/after

};

foreach (string input in inputs) 
{ 
    string result = Regex.Replace(input, pattern, "#"); 
    Console.WriteLine("Original: {0}\nResult: {1}", input, result); 
} 

Выход:

Original: &nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A&nbsp;Some Text &nbsp; here

Result: &nbsp;AA#A&nbsp;&nbsp;C#D&nbsp;&nbsp; A#Some Text &nbsp; here

Original: &nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A &nbsp;Some Text &nbsp; here

Result: &nbsp;AA#A&nbsp;&nbsp;C#D&nbsp;&nbsp; A &nbsp;Some Text &nbsp; here

+0

Спасибо, много. В следующий раз я просто отправлю вам свои источники, чтобы исправить :) Отличный пример !!! – ManniAT

1

Я не знаком с с # частности регулярное выражение вкус, но в PERL/PHP стиль это работает для меня:

s/(?<!\A| |&nbsp;)&nbsp;(?!&nbsp;|)/#/g

Это г elies на отрицательном lookbehind, отрицательный lookahead и \ A = начало входной escape-последовательности.

+0

Would (с некоторыми изменениями) работы - спасибо. Я выбираю ответ Ахмада, потому что он решает всю проблему. – ManniAT

1

Вы должны попробовать следующий пример:

string s = Regex.Replace(original, "(?<!(&nbsp;| |^))&nbsp;(?!(&nbsp;|))", "#");

+0

Да, у меня была такая же проблема ... используйте обратный тик, а не 4-секундный отступ. – beggs

+0

@beggs: Спасибо, просто пытался понять это. Будет редактировать. – LukeH

+0

Вы можете сократить его далее до '(?

0

Вы можете использовать это один

[^^\s(nbsp;)](nbsp;)[^$\s(nbsp;)] 
Смежные вопросы