最简单的解决方案是在正则表达式中使用括号来捕获您希望在替换中使用的原始字符串部分,然后通过特殊序列将其包含在替换字符串中$1
。对于您的示例:
'/Library/Application%20Support/Adobe/Fireworks%20CS6/Commands'.replace(
/^.*\/(CS[0-9]+).*$/,
'/Library/Caches/Adobe/TypeSupport/$1');
// => /Library/Caches/Adobe/TypeSupport/CS6
(您可以有多个括号,在这种情况下,后续组是$2
,$3
等。有时您关心的字符串恰好与整个正则表达式匹配,在这种情况下,您可以$&
在替换字符串中使用,并且不需要任何括号。)
正如您所做的那样,这对于简单地包含源字符串中的文字文本非常有用。
但是,如果您正在做一些更花哨的事情-例如尝试更改匹配文本的大小写-它将无法正常工作。('$1'.toLowerCase()
将简单地将文字字符串 '$1' 转换为小写,然后将其传递给replace
; 没有帮助。)对于这些情况,您可以使用函数而不是字符串作为替换。每次匹配都会调用一次,并传递匹配的字符串部分(相当于$&
字符串版本);如果正则表达式中有括号,它将按顺序传递一个包含每个组匹配项的附加参数。因此,您可以像这样将示例转换为小写:
'/Library/Application%20Support/Adobe/Fireworks%20CS6/Commands'.replace(
/^.*\/(CS[0-9]+).*$/,
function(whole_match, cs_number) {
return "/Library/Caches/Adobe/type_support/" + cs_number.toLowerCase()
});
// => /Library/Caches/Adobe/type_support/cs6
您可以在此处阅读 Mozilla 规范/文档。