0

我有以下 javascript 字符串

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

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

/Library/Caches/Adobe/TypeSupport/CS6

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

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

谢谢你的帮助

4

2 回答 2

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 规范/文档。

于 2012-11-15T02:38:48.627 回答
0

当然 :

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

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

于 2012-11-15T02:31:18.187 回答