正規表現を使用して、JavaScript 正規表現を分解できます。
次に、正規表現を JavaScript の字句的に単純なサブセットに変換する必要があります。これにより、意味に関するすべての非コンテキストフリーの奇妙さ/
と、入力正規表現の不規則性が回避されます。
var REGEXP_PARTS = "(?:"
// A regular character
+ "[^/\r\n\u2028\u2029\\[\\\\]"
// An escaped character, charset reference or backreference
+ "|\\\\[^\r\n\u2028\u2029]"
// A character set
+ "|\\[(?!\\])(?:[^\\]\\\\]|\\\\[^\r\n\u2028\u2029])+\\]"
+ ")";
var REGEXP_REGEXP = new RegExp(
// A regex starts with a slash
"^[/]"
// It cannot be lexically ambiguous with a line or block comemnt
+ "(?![*/])"
// Capture the body in group 1
+ "(" + REGEXP_PARTS + "+)"
// The body is terminated by a slash
+ "[/]"
// Capture the flags in group 2
+ "([gmi]{0,3})$");
var match = myString.match(REGEXP_REGEXP);
if (match) {
var ctorExpression =
"(new RegExp("
// JSON.stringify escapes special chars in the body, so will
// preserve token boundaries.
+ JSON.stringify(match[1])
+ "," + JSON.stringify(match[2])
+ "))";
alert(ctorExpression);
}
これは、よく理解されている JavaScript のサブセットに含まれる式になります。
上記の複雑な正規表現はTCBにはありません。セキュリティを保持するために正しく機能する必要がある唯一の部分はctorExpression
、JSON.stringify
.