2013-07-24 137 views
4

我正在研究一個特殊的正則表達式來匹配一個JavaScript正則表達式。Javascript正則表達式匹配正則表達式

現在我有這樣的正則表達式的工作:

/\/(.*)?\/([i|g|m]+)?/ 

例如:

'^foo'.match(/\/(.*)?\/([i|g|m]+)?/) => ["^foo", "^foo", undefined] 

'/^foo/'.match(/\/(.*)?\/([i|g|m]+)?/) => ["/^foo/", "^foo", undefined] 
'/^foo/i'.match(/\/(.*)?\/([i|g|m]+)?/) => ["/^foo/i", "^foo", "i"] 

現在我需要得到這個正則表達式與合作不幸的是我以前正則表達式不適用於那個。

有人可以幫助我找到一個正則表達式匹配這個例子(和其它太):

'^foo'.match([a regex]) => ["^foo", "^foo", undefined] 
+2

你的第一個正則表達式也匹配'/ foo/|||'FYI。 – Sean

+0

我簡直就是用一個新的轉折問了這個問題。看看[slak的評論](http://stackoverflow.com/questions/37535865/regex-describing-a-regex-pattern#comment62561839_37535865)... – 2016-05-31 02:28:40

回答

6

正則表達式匹配一個正則表達式是

/\/((?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+)\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/ 

要打破它,

  1. \/符合字面意義/
  2. (?![*+?])是必要的,因爲/*開始評論,而不是正則表達式。
  3. [^\r\n\[/\\]任何非轉義序列字符和字符組的非啓動
  4. \[...\]的字符組匹配其可含有相匹配的非轉義/
  5. \\.轉義序列
  6. +是必要的前綴匹配,因爲//是一個行註釋,而不是一個正則表達式。
  7. (?:g...)?匹配非重複正則表達式標誌的任意組合。這麼難看。

這不會嘗試對括號進行配對,或者檢查重複修飾符是否未應用於自身,但會過濾掉大多數其他正則表達式無法語法檢查的方式。

如果你需要一個,只是身體相匹配,只是去掉一切:

/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+/ 

或替代,在你輸入的開頭和結尾添加"/"

+10

我不知道通過看這是否工作,但我知道它嚇到我了。 –

+0

@MarkAmery,是的。正則表達式是這樣的線路噪聲。 –

+2

''/foo/i'.match(/\/((?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[ ^^ \ r \ n \] \\] | \\)* \])+ \ /(?:克(:?IM | M)| I(:????克| M)|米(?: gi?| i)?)?/)'結果是'['/ foo/i']'。這不是預期的結果。 – julesbou