Как работает это регулярное выражение Powershell?

#regex #powershell

#регулярное выражение #powershell

Вопрос:

 '<Relation From="701047080" ObjectNumber="166543300" Output="77" To="464616324">' -match '(?<=Output=")[^"]*'
  

$matchs затем содержит 77?

Чего я и хочу, я просто не понимаю, почему это работает?

Я нашел материал, в котором говорилось, что я мог:

 match '(?<NAME>Some regex)'
  

Но я понятия не имею, что ‘(?<=’ работает? И мне бы ОЧЕНЬ хотелось понять синтаксис…

Мне действительно нужно извлечь значение Output и для обоих… И в системе, в которой мне нужно это сделать, есть только powershell…

Ответ №1:

Выражение (?<=Output=") представляет собой поиск сзади. Оно совпадает только сразу после строки Output=" .

Выражение [^"]* представляет собой отрицаемый символьный класс. Оно сопоставляет все символы до следующей двойной кавычки (или до конца строки, если двойных кавычек больше нет).

Комментарии:

1. Я понимаю часть [^»] * . Но спасибо, что дали ссылку, в которой описан «поиск сзади», а не поиск, который я выполнял в powershell regex, объяснил эту часть.

Ответ №2:

В [^"]* нем указано любое количество символов, отличных от " .

[^"]* Это основное выражение.

В (?<=Output=") данном случае это поисковое выражение, которое гарантирует, что основное выражение следует за выражением в поисковом Output=" выражении. Выражение lookbehind не включено в сопоставление

Я не думаю, что регулярное выражение является оптимальным.

Вы могли бы использовать:

 '<Relation From="701047080" ObjectNumber="166543300" Output="77" To="464616324">' -match 'Output="(.*?)"'
  

(с регулярным выражением, таким простым, как Output="(.*?)" )

и получил 77 в $matches[1]

Вероятно, регулярное выражение было просто усложнено с помощью lookbehind, чтобы сделать Output=" его не частью соответствия. Это делает регулярное выражение более сложным и снижает производительность. Все, что вам нужно, это приведенное выше регулярное выражение и извлечь 77 с соответствующей группой.

Комментарии:

1. Мне тоже понравился ваш ответ, но я могу выбрать только один «правильный ответ». Поскольку я просил объяснить, почему это сработало, я решил предоставить ссылку на описание того, что на самом деле представляет собой lookbehind, было более правильным ответом. Однако мне нравится более простое регулярное выражение, которое вы мне показали! Большое спасибо!