Регулярное выражение PowerShell не совпадает с символом новой строки - PullRequest
1 голос
/ 09 марта 2019

У меня есть вывод exe в форме

Compression          : CCITT Group 4
Width                : 3180

и я пытаюсь извлечь CCITT Group 4 в $var с помощью скрипта PowerShell

$var = [regex]::match($exeoutput,'Compression\s+:\s+([\w\s]+)(?=\n)').Groups[1].Value

The http://regexstorm.net/tester скажем, регулярное выражение Compression\s+:\s+([\w\s]+)(?=\n) верно, но не PowerShell.PowerShell не соответствует.Как правильно написать регулярное выражение?

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

Вы хотите получить весь текст от определенного шаблона до конца строки.Таким образом, вам даже не нужно смотреть вперед (?=\n), просто используйте .+, потому что . соответствует любому символу, кроме символа новой строки (LF):

$var = [regex]::match($exeoutput,'Compression\s+:\s+(.+)').Groups[1].Value

Или вы можете использовать *Оператор 1007 * и после обнаружения совпадения получить доступ к захваченному значению, используя $matches[1]:

$exeoutput -match 'Compression\s*:\s*(.+)'
$var = $matches[1]
1 голос
/ 10 марта 2019

Полезный ответ Wiktor Stribiżew упрощает ваше регулярное выражение и показывает, как использовать оператор
-match PowerShell в качестве альтернативы.

Ваш последующий комментарий по поводу трубопровода к Out-String исправление вашей проблемы подразумевает, что ваша проблема заключалась в том, что $exeOutput содержал массив строк, а не одну многострочную строку.

Это действительно то, что происходит, когдавы захватывает вывод из вызова внешней программы (*.exe): PowerShell записывает выходные строки stdout в виде массива строк (строки без завершающего символа новой строки).

В качестве альтернативы преобразованию массива $exeOutput в одну многострочную строку с Out-String (что, кстати, медленно [1] ), вы можете использовать switch оператор для непосредственной работы с массивом:

# Stores 'CCITT Group 4' in $var
$var = switch -regex ($exeOutput) { 'Compression\s+:\s+(.+)' { $Matches[1]; break } }

В качестве альтернативы, учитывая конкретный формат строк в $exeOutput, вы можете использовать
ConvertFrom-StringData командлет , который может выполнятьm разбора строк в пары ключ-значение после замены разделителя : на =:

$var = ($exeoutput -replace ':', '=' | ConvertFrom-StringData).Compression

[1] Использование командлета обычно медленнее, чем выражение ;с массивом строк $array в качестве входных данных вы можете добиться того, что $array | Out-String делает более эффективно с $array -join "`n", хотя обратите внимание, что Out-String также добавляет трейлинг перевод строки.

...