包含括号的JavaScript Regex Pattern

时间:2012-09-13 02:29:51

标签: javascript regex less

使用JavaScript我需要为给定模式的第一个实例检查字符串,并返回模式之后的所有内容。请参阅下面的示例,了解典型的字符串,模式和所需结果。

我遇到的主要问题是该模式几乎肯定会包含括号等特殊字符。我无法手动更改模式以逃避这些特殊字符。除非我能够首先使用replace执行此操作?

e.g。 result = string.match(pattern.replace(特别与转义))

我不确定这样的事情是否可能。正则表达式总让我头疼,我会欣赏正确或替代方向的任何指示。

背景

我正在尝试为LESS做一些复杂的混音。所以我只能通过反向标记来逃避单行JavaScript。有关在LESS中使用JavaSCript的信息,请参阅here。我希望使用新的可变参数支持来获得多个颜色停止。例如。radial-gradient(@shape, @position, @colorStops...)但是LESS只会为您提供使用@arguments时传递的所有参数。因此,我希望使用正则表达式将@arguments用于字符串,并使用@colorStop作为模式,并返回所有内容,包括第一个颜色停止。使用@colorStop时,LESS返回第一个颜色停止变量。一般概念取自here

例如:

  

字符串:circle 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

2 个答案:

答案 0 :(得分: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() method.substr() method

结合使用
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/

答案 1 :(得分:1)

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

否则(如果您需要正则表达式功能或需要替换模式的所有出现),那么您可以在字符串中create a function to escape the special characters并动态生成正则表达式对象。