2

使用 JavaScript,我需要检查给定模式的第一个实例的字符串,并在该模式之后(包括该模式)返回所有内容。有关典型字符串、模式和所需结果,请参见下面的示例。

我遇到的主要问题是该模式几乎肯定会包含特殊字符,例如括号。我无法手动更改模式以转义这些特殊字符。除非我能够先使用它replace吗?

例如result = string.match(pattern.replace(特殊转义))

我不确定这样的事情是否可行。正则表达式总是让我头疼,我将不胜感激任何正确或替代方向的指示。

背景

我正在尝试为 LESS 做一些复杂的混合。所以我通过使用反引号转义来限制单行 JavaScript。有关在 LESS 中使用 JavaSCript 的信息,请参阅此处。我希望使用新的可变参数支持来获得多个颜色停止。例如。radial-gradient(@shape, @position, @colorStops...)然而,LESS 只为您提供使用@arguments 时传递的全部参数。所以我希望使用正则表达式将@arguments 用于字符串,@colorStop 用于模式,并在第一个颜色停止之后返回所有内容,包括第一个颜色停止。使用 @colorStop 时,LESS 返回第一个颜色停止变量。一般概念取自这里

例如:

字符串:圆 0% 50% rgba(96, 16, 48, 0) 9px #661133 10px rgba(96, 16, 48, 0) 11px

图案:rgba(96, 16, 48, 0) 9px

结果:rgba(96, 16, 48, 0) 9px #661133 10px rgba(96, 16, 48, 0) 11px

4

2 回答 2

2

“我无法手动更改模式以转义这些特殊字符。除非我能够先使用 .replace 来做到这一点?”

是的你可以。给定一个变量pattern,它是一个包含正则表达式模式的字符串,然后:

pattern = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');

...将转义所有在正则表达式中具有特殊含义的字符,并将结果放回同一个变量中。当然,只有当您的模式中的每个字符都被视为要匹配的文字字符时才有效。

“我需要检查给定模式的第一个实例的字符串,并在模式之后返回所有内容,包括模式”

我只是附加.*到模式的末尾,所以它将匹配指定的位,后跟所有以下字符。也就是说,如果一个正则表达式/abc/匹配第一个实例,"abc"那么该正则表达式/abc.*/将匹配"abc"加上后面的每个字符。(在正则表达式中,.匹配任何字符,并且*匹配前一位零次或多次,默认情况下进行“贪婪”匹配。)

把它放在一起:

function matchToEnd(pattern, str) {
    var re = new RegExp(pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&') + ".*"),
        result = str.match(re);
    if (result)
       return result[0];
    else {
       // didn't match, return default value of your choice, e.g.:
       return null;
    }
}

var result = matchToEnd("rgba(96, 16, 48, 0) 9px",
                        "rgba(96, 16, 48, 0) 9px #661133 10px rgba(96, 16, 48, 0) 11px");

演示:http: //jsfiddle.net/JVdnz/

请注意,尽管回到我之前必须做出的假设,即您的正则表达式模式不包含任何在正则表达式中具有特殊含义的字符,如果是这种情况,那么您不需要正则表达式来执行此任务,您可以只需将该.indexOf()方法与该.substr()方法结合使用:

var i = str.indexOf(pattern);  // find index of first instance of pattern
if (i != -1)
   return str.substr(i);       // return from that index to end of string

这是一个类似于以前的演示但.indexOf()不是正则表达式的演示:http: //jsfiddle.net/JVdnz/1/

于 2012-09-13T04:42:55.953 回答
1

如果您的模式不需要使用任何正则表达式功能,并且如果您只需要替换第一次出现的情况,那么您可以将字符串作为模式传递给 replace 方法。

否则(如果您需要正则表达式功能或需要替换所有出现的模式),那么您可以创建一个函数来转义字符串中的特殊字符并动态生成一个正则表达式对象。

于 2012-09-13T02:33:33.937 回答