2013-03-17 103 views
7

我想在JavaScript中評論正則表達式。評論正則表達式

人們似乎對如何從使用正則表達式的代碼刪除評論很多資源,但實際上沒有怎麼評論中的JavaScript正則表達式,使他們更容易理解。

任何幫助,非常感謝!

+0

如果您正在尋找[類似Perl的'/ x'修飾符](http://stackoverflow.com/q/632795/139010),那麼JavaScript中就沒有這種東西。 – 2013-03-17 16:36:10

+2

有趣的問題。我將我的正則表達式分割爲字符串並對字符串進行註釋,然後將它們連接到RegExp中。我很想聽到更好的方法。 – 2013-03-17 16:37:57

回答

10

不幸的是,JavaScript沒有像其他一些語言那樣的正則表達式文本的詳細模式。您可能會發現this interesting, though

代替任何外部庫的,最好的辦法就是使用一個普通的字符串,並評論說:

var r = new RegExp(
    '('  + //start capture 
    '[0-9]+' + // match digit 
    ')'  //end capture 
); 
r.test('9'); //true 
+0

有趣但顯而易見的限制是它不會讓您構建正則表達式文字。 – 2013-03-17 16:51:28

+1

使用「新RegExp()」語法無法獲得的正則表達式文本可以獲得什麼? – plemarquand 2013-03-17 16:52:25

+3

@plemarquand逃離成爲一種痛苦。當你在一個字符串中嵌入一種語言時,你需要考慮它的特殊字符。例如,'/ s \/\ d + /'變成'\\ \ \ \\ d +''。因此,動態構建時需要小心。基本上,你在服務器端語言湯時遇到同樣的麻煩。 – Zirak 2013-03-17 16:59:19

1

我建議你在正則表達式的上面加上一個常規註釋來解釋它。

您將擁有更多的自由。

+1

在這種情況下,線條上方的常規註釋如何幫助: '(?:[a-z0-9!#$%&'* +/=?^ _'{|}〜 - ] +(?:\ [A-Z0-9#$%&'* +/=^_'{|}〜 - !?] +)* |「(?:[\ x01- \ X08 \ X0B \ X0C \ x0e- \ X1F ?\ X21 \ x23- \ x5b \ x5d- \ 0x7F部分] | \\ [\ x01- \ X09 \ X0B \ X0C \ x0e- \ 0x7F部分)*「)@(:(:[A-Z0-9] (?:[A-Z0-9 - ] * [A-Z0-9])?\)+ [A-Z0-9](?:[A-Z0-9 - ] * [A-Z0-9 ])|?\ [(:(?: 25 [0-5?] | 2 [0-4] [0-9] |?[01] [0-9] [0-9])\)。 {3}(?: 25 [0-5] | 2 [0-4] [0-9] | [01] [0-9] [0-9] |?[A-Z0-9 - ] * [A-Z0-9]:(?:[\ x01- \ X08 \ X0B \ X0C \ x0e- \ X1F \ x21- \ X5A \ x53- \ 0x7F部分] | \\ [\ x01- \ X09 \ X0B \ X0C \ x0e- \ x7f])+)\])$' 這是電子郵件的正則表達式 – 2013-03-17 16:39:00

+0

您在上面放置了一個多行註釋。並且你解釋每塊大塊(與Explosion Pills所建議的一樣,但是在上面),如果你需要修改註冊表,它會更加方便。 – Jean 2013-03-17 16:40:11

+4

@BenjaminGruenbaum你知道[你的電子郵件正則表達式可能有缺陷](http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/),對不對? – 2013-03-17 16:40:52

3

在其他幾種語言(尤其是Perl的),有特殊x標誌。設置後,正則表達式會忽略其中的任何空格和註釋。可悲的是,JavaScript正則表達式不支持x標誌。

缺乏語法,利用可讀性的唯一方法是約定。我要在棘手的正則表達式之前添加一條評論,包含它,就好像你已經有了x標誌。例如:

/* 
    \+?  #optional + sign 
    (\d*) #the integeric part 
    (  #begin decimal portion 
    \. 
    \d+ #decimal part 
) 
*/ 
var re = /\+?(\d*)(\.\d+)/; 

對於更復雜的例子,你可以看到我所用的技術herehere完成。

+1

+1對'#read以上,我沒有重複這個廢話'(是的,有人跟隨你的鏈接)。 – 2013-03-17 16:50:27