2014-06-12 5 views
1

와일드 카드를 사용하여 여러 단어 일치와 일치하는 하위 패턴을 사용해 보았지만 작동하지 않습니다. *을 (를) 대체하려고 했습니까? 그러나 여전히 아무것도 일치하지 않습니다. + 및 {1,}을 사용하여 발생 횟수를 지정한 경우에만 작동합니다.펄 정규 표현식 와일드 카드가 하위 패턴 그룹화에서 작동하지 않습니다.

누구든지 설명 할 수 있습니까?

$_ = "Larry has a camel little little little camel has a little camel"; 
print "Matched:--$`<<$&>>$'--\n" if /(little)*/;  

당신은 "little "0 개 이상의 반복이있는 곳 1 위를 찾으려고 노력 Matched:--Larry has a camel <<little little little >>camel has a little camel--

출력 Matched:--<<>>Larry has a camel little little little camel has a little camel--

+2

''영어 사용 ""을하고'$ \', $ &, $ ''를 각각 $ PREMATCH, $ MATCH, $ POSTMATCH로 변경 하시겠습니까? 그것은 당신의 코드를 훨씬 더 읽기 쉽게 만들어 주며, 독자가 펄을 싫어하게 만들지 않을 것이다. –

+0

Damian Conway의 [Regexp :: Debugger] (https://metacpan.org/pod/Regexp::Debugger)에서 정규식을 처리하는 대화식 방법을 확인하십시오. – Kaoru

답변

4

을 기대했다. 무언가를 0 번 반복하면 아무 곳에서나 찾을 수있는 빈 문자열이 생깁니다. 실제로 첫 번째 문자열은 문자열의 시작 부분에 있습니다. 실제로 심지어 "big"에는 "little " (처음에는 문자열의 시작 부분에 있음)이라는 0 개 이상의 반복을 찾을 수있는 네 곳이 있습니다.

"0 이상"을 + "하나 이상"으로 변경하면 찾은 것처럼 원하는대로 작동합니다.

+0

설명해 주셔서 감사합니다. 문자열/char가 문자열의 시작 부분에 있지 않는 한, 문자열/문자 일치에 대해'*'를 사용하면 항상 반복을 찾습니다. * 또는?를 사용하기 가장 좋은 시간? \ s \ w와 같은 메타 문자를 사용합니까? – user2763829

+1

'*'당신이 앵커 할 다른 것을 가지고 있다면 위대한 것입니다. 이 문제는 전체 패턴이 길이가없는 시퀀스와 일치 할 수있는 경우에만 나타납니다. 예를 들어 '낙타 (작은) *'는 '낙타'비트가 그다지 사소한 것이 아니기 때문에 "낙타 조금"과 일치 할 것입니다. 그런 다음 실제로 일치하는 것을 발견 할 수있는 지점을 찾았습니다. 할 수있는 모든 일을 다해라. – Amadan