包含括号的 JavaScript 正则表达式模式

标签 javascript regex less

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

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

例如result = string.match(pattern.replace(special with escaped))

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

背景

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

例如:

String: circle 0% 50% rgba(96, 16, 48, 0) 9px #661133 10px rgba(96, 16, 48, 0) 11px

Pattern: rgba(96, 16, 48, 0) 9px

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

最佳答案

"I cannot alter the pattern manually to escape those special characters. Unless I am able to do that using .replace first?"

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

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

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

"I need to check a string for the first instance of a given pattern and return everything after, and including, the pattern"

我只是将 .* 附加到模式的末尾,这样它将匹配指定的位后跟所有以下字符。也就是说,如果正则表达式 /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/

关于包含括号的 JavaScript 正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12398640/

相关文章:

java - 通过正则表达式进行 JTable 单元格验证

css - 960.gs/Blueprint 和 LESS 有什么区别?

java - 当 Bootstrap 调用远程模式时,Google reCaptcha 不会加载

javascript - 处理多个组件之间路由的 Prop

JavaScript 不调用函数

java - 解析一行数据: split vs regex

html - LCOV 从代码覆盖分析中排除整个包

css - 无法在 IE 8-9 (Joomla) 的 Gantry header 中更改颜色

css - LESS:如何访问另一个名称中有变量的变量引用的变量?

javascript - 检查元素是否插入页面