16

引数のリストを有効なパスに連結するJS関数を作成したかった(パスの一部にスラッシュが付いているかどうかがわからなかったため)

これは機能です:

concatPath = function() {
    var path = "";
    for(var i = 0; i < arguments.length; i++)   {
        path += arguments[i].replace("(\\|/)$|^(\\|/)", "") + "/";
    }
    return path;
}

使用されたRegExは、 http: //regexpal.comのすべての開始スラッシュと終了スラッシュおよびバックスラッシュと一致しまし たが、関数は正しく機能しません(RegExは一致しません)。さらに、Chromeは

SyntaxError:無効な正規表現:/()$ | ^()/:終了していないグループ

正規表現を使用するだけの場合

 (\\)$|^(\\)

ただし、正規表現を使用する

 (\\)$|^(\\)

正常に動作します。

手遅れですか、それとも何か特別なものを見逃しましたか?

前もって感謝します!

レオ

4

2 に答える 2

21

の呼び出しでは、文字列リテラル(または)/.../の代わりに正規表現リテラル()を使用する必要があります。文字列には、正規表現コンストラクターがクラックを取得する前に開始されるバックスラッシュの独自の解釈があるため、追加レベルの引用符が必要です。'...'"..."replace

1つの円記号、正規表現リテラルに一致します。/\\/

文字列内の1つのバックスラッシュ、正規表現に一致します。'\\\\'

ただし、正規表現リテラルでは、スラッシュは全体の区切り文字であるため、スラッシュの前にバックスラッシュを配置する必要もあります。

path += arguments[i].replace(/(\\|\/)$|^(\\|\/)/, "") + "/";

または、何らかの理由で文字列の使用と結婚している場合は、これも機能するはずです。

path += arguments[i].replace("(\\\\|/)$|^(\\\\|/)", "") + "/";

ちなみに、あなたの選択肢が単一のキャラクターである場合、それ(x|y)はやり過ぎです。文字クラス()を使用するだけです[xy]。その場合、あなたはこれを手に入れます:

path += arguments[i].replace(/[\\\/]$|^[\\\/]/, "") + "/";

path += arguments[i].replace("[\\\\/]$|^[\\\\/]", "") + "/";
于 2012-05-27T00:13:42.623 に答える
6

これを試してみてください...[キャラクタークラス]をフォローする方が少し簡単です。シングル\を必要なjavascript文字列と一致させるには\\\\、これが行われている可能性があります。

new Regexp('^[\\\\/]|[\\\\/]$')

/^[\\\/]|[\\\/]$/g表記を試すこともできます。

s = 'c:\\folder\\'
console.log(s.replace(/^[\\\/]|[\\\/]$/g, ''))
于 2012-05-26T21:42:45.760 に答える