Различия в захвате регулярных выражений PowerShell - PullRequest
0 голосов
/ 01 ноября 2018

Цель состоит в том, чтобы получить только первые цифры перед символом ПРОБЕЛ из строки. Когда я использую -replace в PowerShell, включаются начальные буквенные символы. Почему это отличается?

PS C:\src\t> 'aasdf123 456' -replace '([\d]+) .*', '$1'
aasdf123

Это не происходит на regex101.com , который производит.

123

Не дубликат

Вопрос не в том, как получить номер. Вопрос в том, почему 'aasdf' соответствует \d. Группа захвата указывает только \d.

1 Ответ

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

Ожидаемое поведение.

Оператор -replace удаляет все непересекающиеся совпадения из входной строки , сохраняя всех несопоставленных частей в результате.

'aasdf123 456' -replace '([\d]+) .*', '$1' вернет assdf123, потому что ([\d]+) .* (равный (\d+) .*) соответствует и записывает в Группу 1 одну или несколько цифр, затем совпадает с пробелом, а затем с остальной частью строки, а затем все совпадение (здесь 123 456) заменяется содержимым группы 1, 123, таким образом, в результате операции -replace сохраняется assdf123.

Ваше утверждение, что regex101 дает другой результат, неверно: оно дает такой же результат :

enter image description here

Даже если вы посмотрите на панель MATCH INFORMATION, есть два значения: полное соответствие 123 456 и значение группы 1 123. Таким образом, нет никакого расхождения вообще.

Чтобы получить всего 123, вы можете использовать решение, описанное в Как получить захваченные группы из Select-String?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...