es5-lexer 또한 분할 표현에서 JS 코드에서 정규 표현식을 구별하는 매우 정확한 추론을 사용하고, JS 렉서는 당신이 만드는 데 사용할 수있는 토큰 레벨 변환을 제공합니다 그 결과 프로그램은 렉서 (lexer)처럼 완전한 JS 파서에 의해 같은 방식으로 해석 될 것이다. /
정규 표현식 guess_is_regexp.js
에서 시작되어 검사가 scanner_test.js
line 401
var REGEXP_PRECEDER_TOKEN_RE = new RegExp(
"^(?:" // Match the whole tokens below
+ "break"
+ "|case"
+ "|continue"
+ "|delete"
+ "|do"
+ "|else"
+ "|finally"
+ "|in"
+ "|instanceof"
+ "|return"
+ "|throw"
+ "|try"
+ "|typeof"
+ "|void"
// Binary operators which cannot be followed by a division operator.
+ "|[+]" // Match + but not ++. += is handled below.
+ "|-" // Match - but not --. -= is handled below.
+ "|[.]" // Match . but not a number with a trailing decimal.
+ "|[/]" // Match /, but not a regexp. /= is handled below.
+ "|," // Second binary operand cannot start a division.
+ "|[*]" // Ditto binary operand.
+ ")$"
// Or match a token that ends with one of the characters below to match
// a variety of punctuation tokens.
// Some of the single char tokens could go above, but putting them below
// allows closure-compiler's regex optimizer to do a better job.
// The right column explains why the terminal character to the left can only
// precede a regexp.
+ "|["
+ "!" // ! prefix operator operand cannot start with a division
+ "%" // % second binary operand cannot start with a division
+ "&" // &, && ditto binary operand
+ "(" // ( expression cannot start with a division
+ ":" // : property value, labelled statement, and operand of ?:
// cannot start with a division
+ ";" // ; statement & for condition cannot start with division
+ "<" // <, <<, << ditto binary operand
// !=, !==, %=, &&=, &=, *=, +=, -=, /=, <<=, <=, =, ==, ===, >=, >>=, >>>=,
// ^=, |=, ||=
// All are binary operands (assignment ops or comparisons) whose right
// operand cannot start with a division operator
+ "="
+ ">" // >, >>, >>> ditto binary operand
+ "?" // ? expression in ?: cannot start with a division operator
+ "[" // [ first array value & key expression cannot start with
// a division
+ "^" //^ ditto binary operand
+ "{" // { statement in block and object property key cannot start
// with a division
+ "|" // |, || ditto binary operand
+ "}" // } PROBLEMATIC: could be an object literal divided or
// a block. More likely to be start of a statement after
// a block which cannot start with a /.
+ "~" // ~ ditto binary operand
+ "]$"
// The exclusion of ++ and -- from the above is also problematic.
// Both are prefix and postfix operators.
// Given that there is rarely a good reason to increment a regular expression
// and good reason to have a post-increment operator as the left operand of
// a division (x++/y) this pattern treats ++ and -- as division preceders.
);
정규 표현식 리터럴을 개시할지 여부를 판정
비트? // 당신이 원하는 것을 // 원한다면 // 할 수 있습니다. – FailedDev
정규식 리터럴인지 확인해야하므로 슬래시를 찾는 것은 그렇게하지 않을 것입니다. – rob