【问题标题】:Javascript string replace method. Using matches in replacement stringJavascript 字符串替换方法。在替换字符串中使用匹配
【发布时间】:2012-11-15 02:28:38
【问题描述】:

我有以下 javascript 字符串

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

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

/Library/Caches/Adobe/TypeSupport/CS6

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

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

感谢您的帮助

【问题讨论】:

  • “是否可以在替换中使用匹配” - 当然可以。您可以捕获子匹配并使用$1$2 等引用它们。或者指定一个回调函数以返回替换文本,其中回调将接收匹配作为参数。更多信息请访问MDN's .replace() page。在您的示例中,有多少输出字符串要硬编码,有多少来自输入? (显然CS6 是可变的,但是Library//Adobe/ 呢?)

标签: javascript regex replace


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当然:

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

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

    【讨论】:

    • 关闭。在 Javascript 中是 $1,而不是 \1
    • @MarkReed 已修复。很奇怪,我之前肯定已经成功使用过 \1 ... 必须是另一种语言。 õo
    • \1 是我熟悉的所有正则表达式风格的反向引用(指向模式中第一个带括号的组)。这可能是你记得的吗?
    猜你喜欢
    • 2011-10-23
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    相关资源
    最近更新 更多