2016-05-09 8 views
2

Использование Asp.net для регулярных выражений.Как заменить специальные символы с помощью regex

Я написал метод расширения, который я хочу использовать для замены целых слов. Слово может также быть одним специальным символом, например «&».

В этом случае я хочу заменить «&» на «и», и мне нужно будет использовать тот же метод, чтобы отменить его обратно с «и» на «&», поэтому он должен работать только для целых слов а не расширенные слова типа «рука».

Я пробовал несколько вариантов шаблона регулярных выражений - началось с '\ bWORD \ b', которое не работало вообще для амперсанда, и теперь имеет «\ sWORD \ s», который почти работает, за исключением того, что он также удаляет пробелы вокруг слова, что означает, что фраза типа «здоровье & красота» заканчивается как «healthandbeauty».

Любая помощь приветствуется.

Вот метод расширения:

public static string ReplaceWord(this string @this, 
     string wordToFind, 
     string replacement, 
     RegexOptions regexOptions = RegexOptions.None) 
    { 
     Guard.String.NotEmpty(() => @this); 
     Guard.String.NotEmpty(() => wordToFind); 
     Guard.String.NotEmpty(() => replacement); 

     var pattern = string.Format(@"\s{0}\s", wordToFind); 

     return Regex.Replace(@this, pattern, replacement, regexOptions); 
    } 
+1

Попробуйте 'var pattern = string.Format (@" (?

+0

Работает! Привет, Виктор, ты звезда. –

ответ

1

Для того, чтобы соответствовать динамической строки, которые должны быть заключены с пробелами (или находиться в начале или в конце строки), вы можете использовать отрицательные lookaheads:

var pattern = string.Format(@"(?<!\S){0}(?!\S)", wordToFind); 
           ^^^^^^^ ^^^^^^  

или даже безопаснее:

var pattern = string.Format(@"(?<!\S){0}(?!\S)", Regex.Escape(wordToFind)); 
               ^^^^^^^^^^^^^ 

Lookbehind (?<!\S) завершит сбой, если слову не будет предшествовать символ без пробелов, и (?!\S) lookahead проиграет совпадение, если слово не будет сопровождаться символом без пробелов.

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