Допустим ли "\ /" внутри регулярного выражения javascript? - PullRequest
7 голосов
/ 22 июля 2011

Действителен ли следующий код?

function test() {
  return /\//.exec("\/");
}
alert(test());

Похоже, что многие миниатюры javascript (включая jsmin в http://jscompress.com/) считают "//" во второй строке началом комментария. Я предполагаю, что это ошибка в "тривиально" реализованных минификаторах, поскольку все реализации браузера я пробовал запустить без проблем. Попробуйте на jsfiddle .

Ответы [ 3 ]

3 голосов
/ 22 июля 2011

Да, это законно. \/ соответствует литералу /. Первый \ ускользает от /. Линия:

/\//.exec("\/");

Оценивает:

["/"]
3 голосов
/ 22 июля 2011

Я был заинтересован в поиске его в спецификациях, и в соответствии с ним оно действительно:

RegularExpressionLiteral ::
    / RegularExpressionBody / RegularExpressionFlags
RegularExpressionBody ::
    RegularExpressionFirstChar RegularExpressionChars
RegularExpressionChars ::
    [empty]
    RegularExpressionChars RegularExpressionChar
RegularExpressionFirstChar ::
    RegularExpressionNonTerminator but not * or \ or / or [
    RegularExpressionBackslashSequence
    RegularExpressionClass
RegularExpressionChar ::
    RegularExpressionNonTerminator but not \ or / or [
    RegularExpressionBackslashSequence
    RegularExpressionClass
RegularExpressionBackslashSequence ::
    \ RegularExpressionNonTerminator
RegularExpressionNonTerminator ::
    SourceCharacter but not LineTerminator

\/ считается RegularExpressionBackslashSequence и, следовательно, является частью RegularExpressionBodyи в результате не может быть частью маркера комментария //.

3 голосов
/ 22 июля 2011

Да, это действительный javascript :) Это ошибка в миниатюре, и, вероятно, ее следует исправить. Вы можете обойти это, если захотите, сделав в своем регулярном выражении что-то глупое, например:

return /\/(?:.|$)/.exec("\/");

Который в основном говорит, либо конец строки, либо не конец строки, без захвата. Но я не думаю, что это хорошее решение, и я бы не стал использовать его сам, ха-ха.

...