2017-02-15 3 views
3

저는 PowerShell에서 Regex를 사용하여 파서를 만들었으며 지금까지 문제가없는 한 실제로 작동합니다.그룹 번호 가져 오기

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

나는 성공, 일치하도록이 정규식을했습니다, 이러한 시나리오 :

Name= "Value" ;Comment

= 후 따옴표 사이에 모든 것을 받아 무시 것인가 나머지

Name=Value ;Comment

= 이후 모든 것을 ; 또는 # 값을

으로 가져옵니다.

이제는 좋지만 문제는 시나리오 1이 값 2와 일치하고 시나리오 2가 값 3과 일치한다는 것입니다. 이것은 어떤 것이 내가 최종 값을 위해 무언가를 포함하고 있는지를 확인하게하는데, 나는 깨끗하지 못하며, 반드시 필요하지는 않습니다. 그래서 여기에 질문이옵니다 : Value [2]는 그 두 그룹의 결과를 어떻게 포함 할 수 있습니까? 대신 비 캡처 그룹의

+1

어떻게 이런 일에 대한 ([^ "] *?) \ 2 \ s * [; #]'] (https : /) /regex101.com/r/R9LcE3/2) – Faibbus

+0

'Name = "Value1; Value2"' 따옴표를 지정하지 않으면 = 뒤에 공백을 캡처하지 않습니다. 'Name = been been ' 에 의해 발견되었습니다. 감사합니다. – Blah

+0

대체 그룹을 만들고 그룹을 만드는 것이 더 좋을 것이라고 생각합니다. '\ * * \ \ * \ 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