Javascript字符串替换方法。在替换字符串中使用匹配

时间:2012-11-15 02:28:38

标签: javascript regex replace

我有以下javascript字符串

/Library/Application%20Support/Adobe/Fireworks%20CS6/Commands

“CS#”部分中的数字可能会更改,但我想将字符串转换为以下格式,请记住数字可能会更改。

/Library/Caches/Adobe/TypeSupport/CS6

我知道我可以通过多种方式做到这一点,但出于教育目的,我正在寻找最好的方法。

我可以使用replace方法使用正则表达式进行搜索,但是可以在替换中使用匹配吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

最简单的解决方案是在正则表达式中使用括号来捕获您希望在替换中使用的原始字符串的一部分,然后通过特殊序列$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规范/文档here

答案 1 :(得分:0)

当然:

'/Library/Application%20Support/Adobe/Fireworks%20CS6/Commands'.replace(/.*(CS[0-9]+).*/, '/Library/Caches/Adobe/TypeSupport/$1');

您可以使用$N来引用捕获组,其中N是组的索引(从1开始)。