我有以下javascript字符串
/Library/Application%20Support/Adobe/Fireworks%20CS6/Commands"CS#“部分中的数字可能会更改,但我希望将字符串转换为以下格式,请记住数字可能会更改。
/Library/Caches/Adobe/TypeSupport/CS6我知道我可以用几种方法做到这一点,但为了教育的目的,我正在寻找最好的方法。
我可以使用正则表达式使用replace方法进行搜索,但是在替换方法中是否可以使用匹配?
谢谢你的帮助
发布于 2012-11-15 10:38:49
最简单的解决方案是在正则表达式中使用括号来捕获要在替换中使用的原始字符串的一部分,然后通过特殊的序列$1将其包含在替换字符串中。对于您的示例:
'/Library/Application%20Support/Adobe/Fireworks%20CS6/Commands'.replace(
/^.*\/(CS[0-9]+).*$/,
'/Library/Caches/Adobe/TypeSupport/$1');
// => /Library/Caches/Adobe/TypeSupport/CS6(您可以有多组括号,在这种情况下,后续的组是$2、$3等。有时您关心的字符串恰好与整个正则表达式完全匹配,在这种情况下,您只需在替换字符串中使用$&,而不需要任何括号。)
这对于简单地包括源字符串中的文字文本非常有用,就像您正在做的那样。
但是,如果您正在执行任何更花哨的操作-例如尝试更改匹配文本的大小写-它将不起作用。(在传递给replace之前,'$1'.toLowerCase()只会将文字字符串'$1‘转换为小写;这没有什么帮助。)对于这些情况,您可以使用函数代替字符串作为替代。它将在每次匹配时调用一次,并传递匹配的字符串部分(相当于字符串版本中的$& );如果正则表达式中有括号,将按顺序传递一个包含每个组的匹配的附加参数。因此,您可以将示例转换为小写,如下所示:
'/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。
发布于 2012-11-15 10:31:18
当然:
'/Library/Application%20Support/Adobe/Fireworks%20CS6/Commands'.replace(/.*(CS[0-9]+).*/, '/Library/Caches/Adobe/TypeSupport/$1');您可以使用$N引用捕获组,其中N是组的索引(从1开始)。
https://stackoverflow.com/questions/13390724
复制相似问题