包含圆括号的JavaScript Regex模式

JavaScript Regex Pattern that contains parentheses

本文关键字:Regex 模式 JavaScript 圆括号 包含      更新时间:2023-09-26

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

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

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

我不确定这样的事情是否可能。Regex总是让我头疼,我很感激任何正确或替代的方向。

背景

我正试着用更少的钱做一些复杂的混音。因此,通过使用反勾号进行转义,我只能使用单行JavaScript。有关在LESS中使用JavaSCript的信息,请参阅此处。我希望使用新的可变参数支持来获得多个颜色停止。例如.radial-gradient(@shape, @position, @colorStops...)然而,LESS只为您提供使用@arguments时传递的全部参数范围。因此,我希望使用regex为字符串使用@arguments,为模式使用@colorStop,并返回第一个颜色停止之后的所有内容(包括第一个颜色结束)。LESS在使用@colorStop时返回第一个颜色停止变量。一般概念取自此处)

例如:

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

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

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

"我无法手动更改模式来转义那些特殊字符。除非我能够使用.replacefirst?"

是的,你可以。给定一个变量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()而不是regex:http://jsfiddle.net/JVdnz/1/

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

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