JS

2012-01-18 2 views
1

에서 정규 표현식 당신은 나에게 무엇을 다음과 같은 정규 표현식 방법을 이해하는 데 도움이 : 그래서JS

(?:.*? rv:([\w.]+))? 

,

(?: //the pattern must be in a string, but doesn't return 
. //any Unicode character except newline 
* //zero or more times 
? //zero or one time (how is *? different from just *) 
rv: //just "rv:" apparently 
[\w //any digit, an underscore, or any Latin-1 letter character 
.] //...or any unicode character (are Latin-1 characters not Unicode?) 
..))? //all that zero or one time 

그것은 "확실한 가이드"에서 그리고 내가 그 책을 싫어. regexp와 일치하지 않는 것과 일치하지 않는 것에 대한 몇 가지 예가 대단히 감사 할 것입니다.

답변

2

정규식은 다음과 같습니다

(?: # begin non capturing group 
.*? # any character, zero or more times, but peek and stop if the next char is 
     # a space (" "); then look for 
rv: # literal "rv:", followed by 
(  # begin capturing group 
[\w.] # any word character or a dot (the dot HAS NO special meaning in a character class), 
+  # once or more, 
)  # end capturing group 
)  # end non capturing group 
?  # zero or one time 

*? 게으른 정량 소위, 그것은 문자를 삼키기 전에 다음 문자를 훔쳐 정규식 엔진을 강제로 - 그것은 남용, 사용 및 학대,이된다 하나의 경우입니다 : 다음 문자는 리터럴 스페이스이므로, 앞뒤가 모두 보이지 않도록 [^ ]* (공백이 아니거나 0 이상인 문자로 교체해야합니다).

결 정적. 권리.

+0

'*?'에 대한 설명이 다소 혼란 스럽습니다. 여기서 문제를 일으키지는 않겠지 만'[^] *'가 더 낫다는 것에 동의합니다. 더 명확하고 효율적입니다. 전혀 다른 무언가 인 Lookahead와 이것을 혼동하지 마십시오. –

+0

@AdamBergmark 나는 lookahead/lookbehind에 대해 알고 있지만 사실은 남아 있습니다. 게으른 한정 기호를 사용하는 경우 정규식 엔진은 다음 문자를 "앞당겨보아야"합니다. 아마 "엿보기"라고 말해야합니다. 실제로, 나는 편집하고 대체 할 것이다. – fge