Удаление пробелов между последовательными номерами - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть строка, из которой я хочу удалить пробелы между числами :

string test = "Some Words 1 2 3 4";
string result = Regex.Replace(test, @"(\d)\s(\d)", @"$1$2");

ожидаемый / желаемый результат будет:

"Some Words 1234"

но я получаю следующее:

"Some Words 12 34"

Что я здесь не так делаю?

Дополнительные примеры:

Input:  "Some Words That Should not be replaced 12 9 123 4 12"
Output: "Some Words That Should not be replaced 129123412"

Input:  "test 9 8"
Output: "test 98"

Input:  "t e s t 9 8"
Output: "t e s t 98"

Input:  "Another 12 000"
Output: "Another 12000"

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Regex.Replace продолжает поиск после предыдущего соответствия:

Some Words 1 2 3 4
           ^^^
         first match, replace by "12"

Some Words 12 3 4
             ^
             +-- continue searching here

Some Words 12 3 4
              ^^^
            next match, replace by "34"

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

string result = Regex.Replace(test, @"(\d)\s(?=\d)", @"$1");

Теперь последняя цифра не часть матча:

Some Words 1 2 3 4
           ^^?
         first match, replace by "1"

Some Words 12 3 4
            ^
            +-- continue searching here

Some Words 12 3 4
            ^^?
            next match, replace by "2"

...
0 голосов
/ 26 февраля 2019

Ваше регулярное выражение использует цифру справа.(\d)\s(\d) сопоставляет и захватывает 1 в Some Words 1 2 3 4 в группу 1, затем сопоставляет 1 пробел, а затем сопоставляет и использует (т. Е. Добавляет к значению совпадения и увеличивает индекс регулярного выражения) 2.Затем механизм регулярных выражений пытается найти другое совпадение из текущего индекса, то есть уже после 1 2.Таким образом, регулярное выражение не соответствует 2 3, но находит 3 4.

Вот ваше демонстрационное выражение и диаграмма, показывающая, что:

enter image description here

Также см. Процесс сопоставления здесь:

enter image description here

Используйте взамен поиски вместо не-потребляемый :

(?<=\d)\s+(?=\d)

См. демонстрационное регулярное выражение

enter image description here

Подробнее

  • (?<=\d) - положительный вид сзади, который соответствует местоположению в строке, непосредственно предшествующей цифре
  • \s+ - 1+ пробелов
  • (?=\d) - положительный прогноз, соответствующий местоположению в строке, за которым сразу следует цифра.

C # demo:

string test = "Some Words 1 2 3 4";
string result = Regex.Replace(test, @"(?<=\d)\s+(?=\d)", "");

См. онлайн-демонстрацию :

var strs = new List<string> {"Some Words 1 2 3 4", "Some Words That Should not be replaced 12 9 123 4 12", "test 9 8", "t e s t 9 8", "Another 12 000" };
foreach (var test in strs) 
{
    Console.WriteLine(Regex.Replace(test, @"(?<=\d)\s+(?=\d)", ""));
}

Выход:

Some Words 1234
Some Words That Should not be replaced 129123412
test 98
t e s t 98
Another 12000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...