Regex - найти и заменить только полные строковые вхождения (не частичные совпадения) - PullRequest
2 голосов
/ 03 апреля 2010

Я не очень хорош в регулярных выражениях, но, возможно, есть простой способ решить эту задачу.

Мне дали строку типа "bla @a bla @a1 bla"

Мне также даются пары типа {"a", "a2"}, {"a1", "a13"}, и мне нужно заменить @a на @a2 для первой пары и @a1 на @a13 для второй.

Проблема в том, что когда я использую String.Replace и ищу @a, он также заменяет @a1, но не должен. Мне нужно, чтобы оно полностью совпадало с @a и не совпадало с ним в других местах.

Примечание: данная строка также может быть скобками, запятыми, точками и так далее. Однако пары всегда будут [a-z]*[0-9]+

Помогите мне с заменой регулярных выражений, пожалуйста.

Приветствия

Ответы [ 2 ]

5 голосов
/ 03 апреля 2010

Использование \b:

@a\b

\b - граница слова нулевой ширины. В основном это означает, что он соответствует переходу из словесных символов (букв, цифр, подчеркиваний) в несловесные символы (все остальное) или наоборот, но не "потребляет" какую-либо часть ввода ( это часть нулевой ширины).

Например:

string s1 = "bla @a bla @a1 bla ";
string s2 = Regex.Replace(s1, @"@a\b", "foo");
Console.WriteLine(s2);

Выход:

bla foo bla @a1 bla
3 голосов
/ 03 апреля 2010

Используйте регулярное выражение со взглядом сзади и границей слова:

Regex regex = new Regex(string.Format(@"(?<!\w)@{0}\b", from));
string result = regex.Replace(input, "@" + to)

Примечание: здесь я использую тот факт, что ваши пары известны как буквенно-цифровые. Если окажется, что это не так, вышеуказанное не будет работать.

В качестве альтернативы вам не нужны регулярные выражения для этой задачи. Вы можете просто разделить ввод по пробелам (при условии, что пробелы всегда являются разделителями), выполнить итерации по частям и найти и заменить те, которые вы ищете, а затем снова соединиться, чтобы сформировать окончательный результат.

string result = string.Join(" ",
    input.Split(' ')
         .Select(x => x == "@" + from ? "@" + to : x)
         .ToArray());
...