1

スラッシュ文字が文字列の末尾にある場合に備えて、スラッシュ文字を取り除こうとしています。行末のスラッシュ以外の任意の文字に一致させるために、次の式を使用しました。

var str = "http://hazaa.com/blopp/";
str.match("[^/$]+", "g");

何らかの理由で (確かに論理的で説明可能ですが、自分で把握することはできません)、次のように 3 つの文字列に分割されます。

["http:"、"hazaa.com"、"blopp"]

  1. 私は何を間違って想定していますか?
  2. それを解決する方法は?
4

4 に答える 4

4

str.match("[^/$]+", "g");、ドル記号を括弧内に入れるのはなぜですか? 外にあるはずstr.match("[^/]+$", "g");です。

末尾のスラッシュをすべて削除するには、str.replace(/\/+$/, ""). (最後の末尾のスラッシュのみを削除したい場合は+replaceの正規表現で を削除します)

アップデート:

を使用しないもう 1 つの方法replace:

function stripEndingSlashes(str) {
    var matched = str.match("(.*[^/]+)/*$");
    return matched ? matched[1] : "";
}
于 2013-01-07T08:36:14.863 に答える
2

正規表現は「スラッシュ以外のすべて」を選択しています。そのためmatch()、スラッシュの間の文字列の部分が返されます。

replace()次の関数で解決できます。

var str = "http://hazaa.com/blopp/";
//replace the last slash with an empty string to remove it
str = str.replace(/\/$/,'');

正規表現リテラルは常に/文字で囲む必要があります。したがって、正規表現は次のとおりです。

  • \/: これは単一のスラッシュ文字を意味します。JavaScript がスラッシュを正規表現の末尾として解釈しないようにするには、バックスラッシュで「エスケープ」する必要があります。

  • $: これは文字列の終わりを意味します

于 2013-01-07T08:39:58.540 に答える
1

現在の正規表現は、最初のまたはが検出されるまで文字列の部分と一致します。2 番目のパラメーターは無視されます。の 2 番目のパラメーターはありません。/$String.match

末尾のスラッシュを削除するには、次のString.replace関数を使用します。

var str = "http://hazaa.com/blopp/";
str = str.replace(/\/$/, "");
console.log(str);
// "http://hazaa.com/blopp"

文字列がスラッシュで終わっているかどうかを確認する必要がある場合は、次のString.matchようなメソッドを使用します。

var str = "http://hazaa.com/blopp/";
var match = str.match(/\/$/);
console.log(match);
// null if string does not end with /
// ["/"] if string ends with a /

である最後の文字を除くすべてのものを取得する必要がある場合は/、これを使用します。

var r = /(.+?)\/*$/;
console.log("http://hazaa.com/blopp//".match(r)); // ["http://hazaa.com/blopp//", "http://hazaa.com/blopp"]
console.log("http://hazaa.com/blopp/".match(r)); // ["http://hazaa.com/blopp/", "http://hazaa.com/blopp"]
console.log("http://hazaa.com/bloppA".match(r)); // ["http://hazaa.com/bloppA", "http://hazaa.com/bloppA"]

返された配列の 2 番目のインデックスには、URL の必要な部分が含まれています。正規表現は次のように機能します。

  • (.+?)貪欲でない任意の文字の一致 (およびキャプチャ)
  • \/*$オプションの末尾のスラッシュに一致

最初の部分の正規表現は、意図的に非貪欲に変更されています。貪欲な場合、正規表現全体が一致する限り、最大の一致を見つけようとします (/プロセスの末尾を消費します)。貪欲でない場合、正規表現全体が一致する限り、最小の一致を見つけます。

于 2013-01-07T08:31:32.303 に答える
0

正規表現を使用する理由 文字列の最後の記号がスラッシュであるかどうかを確認してからスライスします。このような:

if (str.slice(-1) === '/') {
  str = str.slice(0, -1);
}
于 2013-01-07T08:37:43.697 に答える