1

是否存在全面的正则表达式,当应用于 JavaScript 源代码时,将匹配所有有效的字符串文字(例如"say \"Hello\"")和正则表达式文字(例如/and\/or/)?表达式必须涵盖所有边缘情况,包括换行符和转义序列。

或者,是否有人知道用于匹配字符串和正则表达式文字之外的模式的正则表达式?

我的目标是实现一个简单的 JavaScript 语法扩展,它允许分隔符(例如{{@foo.bar}}#@foo.bar#)中的宏被预处理器扩展。但是,我希望只在文字之外处理宏。

目前,我尝试仅使用字符串替换来完成此操作,而无需扩充现有的 JavaScript 词法分析器/解析器。

这个 JavaScript 预处理器本身将在 JavaScript 中实现。

4

4 回答 4

1

这是我一直用来匹配带引号的字符串的正则表达式,它非常好,因为它几乎可以与所有引擎一起使用,因为它不需要回溯或反向引用或任何巫术。这将匹配所有文本 INSIDE 文字。

"(\\.|[^"])*"

根据引擎,它可能支持非捕获组。在这种情况下,您可以使用

"(?:\\.|[^"])*"

它应该更快。

于 2012-04-30T06:15:56.190 回答
0

我可能会去做如下的事情。但是,对于某些可能的情况,它需要改进。

var str = '"aaa \"sss \\t bbb" sss #3 ss# ((t sdsds)) ff ';
str += '/gg sdfd \/dsds/ {aaa bbb} {{ss}} {#sdsd#}';

var repeating = ['"','\\\'','/','\\~','\\#'];
// "example" 'example' /example/ ~example~ #example#
var enclosing = [];
enclosing.push(['\\{','\\}']);
enclosing.push(['\\{\\{','\\}\\}']);
enclosing.push(['\\[','\\]']);
enclosing.push(['\\(\\(','\\)\\)']);
// {example} {{example}} [example] ((example))

for (var forEnclosing='',i = 0 ; i < enclosing.length; i++) {
    var e = enclosing[i];
    var r = e[0]+'(\\\\['+e[0]+e[1]+']|[^'+e[0]+e[1]+'])*'+e[1];
    forEnclosing += r + (i < enclosing.length-1 ? '|' : '');
}
for (var forRepeating='',i = 0; i < repeating.length; i++) {
    var e = repeating[i];
    var r = e+'(\\'+e+'|[^'+e+'])*'+e;
    forRepeating += r + (i < repeating.length-1 ? '|' : '');
}

var rx = new RegExp('('+forEnclosing+'|'+forRepeating+')','g');
var m = str.match(rx);
try { for (var i = 0; i < m.length; i++) console.log(m[i]) }
catch(e) {}

输出:

"aaa "sss \t bbb"
#3 ss#
((t sdsds))
/gg sdfd /dsds/
{aaa bbb}
{{ss}}
{#sdsd#}
于 2012-04-30T21:51:21.570 回答
0

与正则表达式最接近的是有一个正则表达式匹配字符串文字(单引号或双引号)或正则表达式或注释(或任何其他可能包含虚假匹配的内容)或您的宏事物之一:

"[^"\\]*(?:\\.[^"\\]*)*"
|
'[^'\\]*(?:\\.[^'\\]*)*'
|
/[^/\\]*(?:\\.[^/\\]*)*/[gim]*
|
/\*[^*]*(?:\*(?!/)[^*]*)*\*/
|
#@(\w+\.\w+)#

如果第 1 组在比赛后包含任何内容,那么它一定是您要查找的内容。否则,忽略这场比赛并继续下一场比赛。

于 2012-04-30T22:51:17.047 回答
0

我认为这对于正则表达式来说太多了。

考虑var foo = "//" // /"(?:\\.|[^"])*"/。字符串、注释和正则表达式文字在哪里开始和结束?您需要编写一个完整的 JavaScript 解析器来涵盖所有边缘情况。当然,解析器将使用正则表达式......

于 2012-08-29T08:23:58.620 回答