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

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

Используйте взамен поиски вместо не-потребляемый :
(?<=\d)\s+(?=\d)
См. демонстрационное регулярное выражение

Подробнее
(?<=\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