2016-01-15 2 views
-1

Я хочу сопоставить следующий многострочный текст в текстовом файле.PowerShell Regular Expression Multiline

[1750256247]
; Rev: B, 5

Я попытался следующие, но не смог добиться успеха. Не могли бы вы мне помочь?

$fileContent | Select-String "(?smi)(^[1750256247](-|\s*$))(^;Rev: B,5$)" -AllMatches | Foreach {$.Matches} | Foreach {$.Value} 
+0

Вы также можете использовать '$ fileContent | Select-String "(? I) \ [1750256247] [- \ s] *; Rev: B, 5" -AllMatches | Foreach {$ _. Матчи} | Foreach {$ _. Value} ' –

+0

npinti тоже не работает на моем конце. Вы пытались '$ fileContent | Select-String "(? I) \ [1750256247] [- \ s] *; Rev: B, 5" -AllMatches | Foreach {$ _. Матчи} | Foreach {$ _. Value} '? Кстати, вы имеете в виду «\ r \ n' linebreak» или «
»? –

+0

Привет, Страбижев, Да, я тоже попробовал. То же самое произошло. Я не понимаю, почему. Я имею в виду [CR] [LF] – AydinK

ответ

0

Не совсем 100% уверен, что вы после этого, но изменив выражение следующим образом: (?smi)(^\[1750256247\](.|-|\s*$))(^;Rev: B,5$) (пример here) работает.

Некоторые проблемы с вашим выражением:

  1. В регулярных выражениях синтаксисе [ и ] символов обозначают наборы символов, то есть, набор символов которой двигатель будет пытаться соответствовать одному из. Если вам необходимо сопоставить фактические цифры [ и ], вам необходимо сбежать от них с помощью символа \.

  2. Вы используете модификатор s, что позволяет символу периода также соответствовать символам новой строки, но вы не используете символ периода.

EDIT: Согласно предложению @ stribizhev, вы можете использовать (?smi)(^\[1750256247](.|-|\s*$))(^;Rev: B,5$). Лично я бы пошел на первый вариант, потому что считаю его более читаемым, но мнения, скорее всего, будут отличаться от этого.

+0

Только '[' следует экранировать здесь. '[' должен быть экранирован за пределами класса символов, а '' 'должен быть экранирован внутри символьного класса, если он не находится в исходной позиции. –

+0

@stribizhev: Так '\ [foo]' будет соответствовать '[foo]'? – npinti

+0

Да, '' 'является неоднозначным символом в большинстве символов регулярных выражений. В Powershell используется регулярное выражение .NET, поэтому оно будет работать следующим образом. –

0

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

$regex = @' 
(?ms)\[1750256247\]\s* 
;Rev: B,5\s* 
'@ 

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