2014-11-14 7 views
0

x = y 형식의 문자열과 일치하는 정규식이 있습니다. 즉 이름이 가치를 부여했습니다. 값은 선택적으로 인용하고 모두 이름과 값은 내 정규식 정규 표현식 및 그룹화

\w+=\w+|"\w+"|'\w+' 

한 줄에 이러한 과제의 다수가있을 수 있습니다

+ W \에 적합하지만, 여기에 내가 문제로 실행 할 수 있습니다. 어떤 이유로이 정규식을 (? :)에 묶을 때 일치하지 않습니다. 출력은 이해가 안

ok 1 
PREMATCH xy= 
MATCH "abc" 
POSTMATCH 
not ok 2 
# Failed test at ./test.pl line 20. 
1..2 
# Looks like you failed 1 test of 2. 

왜 첫 경기와 두 번째가 아닌

use Test::More; 

my $re1 = qr/^\w+=\w+|"\w+"|'\w+'$/p; 
my $re2 = qr/^(?:\w+=\w+|"\w+"|'\w+')$/p; 

ok('xy="abc"' =~ $re1); 

say "PREMATCH ${^PREMATCH}"; 
say "MATCH ${^MATCH}"; 
say "POSTMATCH ${^POSTMATCH}"; 


ok('xy="abc"' =~ $re2); 

done_testing; 

아래의 테스트 케이스를 참조하십시오. 그리고 저는 왜 첫 번째 것이 등호 뒤에있는 부분과 만 일치하는지 이해하지 못합니다. 그것의 끝에서 발생하는 단어 또는 단어 주위에 따옴표 주변에 공백 또는 인용 부호 다음에 ^ 일치하는 경우 귀하의

^\w+=\w+|"\w+"|'\w+'$ 

+0

당신은'xy'와' "ABC" '모두 일치하려고 :

/^\w+=\w+|^\w+="\w+"|^\w+='\w+'$/ 

두 번째는 교대를 클러스터링하는 것입니다? – Degustaf

답변

1

(?:^\w+=\w+)|(?:"\w+")|(?:'\w+'$) 

에 해당 끈. 귀하의

^(?:\w+=\w+|"\w+"|'\w+')$ 

는 해당 그룹의 다음 (때문에 그룹의 ^ 외부) 라인의 시작 부분에 그룹의 시작에서 그 다음 다양한 테스트, 그리고 모두 모두 수행해야합니다 필요 문자열 끝에 (그룹 외부에 $이 있기 때문에) 완료하십시오.

간단한 수정은 단순히 그룹에 ^$ 모두를 이동하는 것입니다 :

(?:^\w+=\w+|"\w+"|'\w+'$) 
+0

'^'만이 교대를위한 첫 번째 선택의 일부가 아니겠습니까? – Degustaf

+0

$ re1의 경우,'^'는 첫 번째 대체 선택의 일부입니다. '(? : ...)'그룹이 $ re2에서 발견되면,'^'는 내가 문제의 일부를 일으킨 것으로 생각할 수있는 대안의 바깥으로 옮겨졌다. – OnlineCop

2

당신은 당신의 교대에 문제가있는. 첫 번째 파이프 앞에 하나의 옵션으로 정규 표현식의 전체 부분을 가져갑니다. 즉,

/^\w+=\w+|"\w+"|'\w+'$/ 

^\w+=\w+ 
"\w+" 

또는

'\w+'$ 

당신이 (내가 볼 수 있음)이 개 선택이이 문제를 해결하려면 일치하는 세 가지 가능성으로 구문 분석됩니다. 먼저 당신이 정말로 원하는 것에 그 선택의 각을 확장 :

/^\w+=(?:\w+|"\w+"|'\w+')$/