4

私は次のようなURLを持っています:

image/media-group/rugby-league-programme-covers-3436?sort=title

また

image/media-group/rugby-league-programme-covers-3436

media-group の後にすべてを取得する必要があります?

したがって、両方のインスタンスrugby-league-programme-covers-3436で、返す必要があるのは

/media-group/(.*)\?クエリ文字列があるインスタンスでは機能しますが、クエリ文字列がないインスタンスでは機能しない正規表現を使用しました。

以下のコードを使用しています

var patt=new RegExp('/media-group/(.*)\?');
return patt.exec(url)[1];

これに関するあなたの助けをいただければ幸いです

4

1 に答える 1

5

最良のパターンは次のようになると思います。

/^[^\#\?]+\/media-group\/([^\?]+).*$/

次のように発生します。

^                 - start of string
[^\#\?]+          - one or more non-hash, non-question-marks
\/                - literal char
media-group       - literal chars
\/                - literal char
(                 - start capture group
  [^\?]+          - one or more chars non-question-marks
)                 - end of capture group
.*                - zero or more chars
$                 - end of string

これが機能する理由は、 [^\?]+ が「貪欲」であるためです。つまり、疑問符の後に任意の文字が続くか、文字列の末尾までのすべての文字が続くため、可能な限り最長の一致を試行します。クエスチョン マーク以外のキャプチャ グループにすでにキャプチャされています。

だから、使用して

var RE=new RegExp(/^[^\#\?]+\/media-group\/([^\?]+).*$/),
    url="image/media-group/rugby-league-programme-covers-3436?sort=title";

console.log(url.match(RE)[1])

印刷:rugby-league-programme-covers-3436と url をimage/media-group/rugby-league-programme-covers-3436に変更すると、同じ結果が得られます。

アップデート

David Foerster のコメントに合わせてパターンを変更しました。

于 2013-07-16T23:35:33.413 に答える