JS

2012-01-18 9 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 

それは「Definitive Guideの」からだと私はその本を憎みます。 正規表現にマッチするものとマッチしないもののいくつかの例は、非常に高く評価されます。

答えて

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

「*?」の説明がちょっと混乱しているのを発見しました。ここでそれを使うのに問題はありませんが、私は '[^] *'が良いことに同意します。より明確で効率的です。まったく異なる何か先読みとこれを混同しないでください。 –

+0

@AdamBergmark私はlookahead/lookbehindについて知っていますが、実際には残っています:遅延量限定子を使用する場合、正規表現エンジンは次の文字を先読みする必要があります。私はおそらく "peek"と言っているはずです。実際、私は編集して置き換えます。 – fge