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;に渡すだけです。役に立たない。)このような状況では、文字列の代わりに関数を使用できます。一致ごとに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の仕様/ドキュメントを読むことができます。

于 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 に答える