2017-02-15 5 views
3

Я делаю парсер с использованием Regex в PowerShell, и он работает очень хорошо до сих пор, за исключением того, что у меня есть.Захват группового номера

\s*([a-zA-Z_]+)\s*=(?:\s*"(.*)"|([^;#]*)) 

Я сделал это Regex чтобы соответствовать, с успехом, эти сценарии:

Name= "Value" ;Comment

Желательный все в кавычки после = и игнорирующие остальные

Name=Value ;Comment

Will взять все после = до ; или # в качестве значения

Теперь это здорово, но проблема, с которой я столкнулся, заключается в том, что сценарий будет соответствовать Value [2], а второй сценарий будет соответствовать Value [3]. Это заставляет меня проверить, какой из них содержит что-то для окончательного значения, которое я не считаю чистым, и я уверен, что это не обязательно. Итак, возникает вопрос: как Value [2] может содержать результат этих двух разных групп? (Использование совершенно другой Regex не проблема, я переписать это одно уже несколько раз)

+1

Как о чем-то вроде этого : ['\ S * ([a-zA-Z_] +) \ s * = \ s * ("?) ([^ "] *?) \ 2 \ s * [; #]'] (https://regex101.com/r/R9LcE3/2) – Faibbus

+0

Это больше не будет захватывать 'Name =" Value1; Value2 "' И не будет занимать пробел после =, если не указаны кавычки: 'Name = найденный ' Спасибо – Blah

+0

Я думаю, было бы лучше сделать чередование группой захвата и remo ve внешние двойные кавычки на втором шаге: '^ \ s * (\ w +) \ s * = \ s * (". *? "| [^; #] *)' –

ответ

0

Используйте именованный захват группы вместо того, чтобы не-захвата группы:

$pattern = '\s*([a-zA-Z_]+)\s*=(?<value>\s*"(.*)"|([^;#]*))' 
$value = ($string |Select-String -Pattern $pattern).Matches.Groups['value'].Value.Trim(' "') 
+0

Ваш ответ ведет в правильном направлении, но включает в себя '' 'в матче. – Faibbus

+0

@Faibbus легко разрешен :-) –

+0

Да, но даже в этом случае вы не можете захватить пробел после =, если не указаны кавычки : 'Name = было найдено' .Вы могли бы сделать это, называя свои внутренние группы с тем же именем. – Faibbus