0

明確にするために、私はこれを作成しました:

http://rubular.com/r/ejYgKSufD4

私の弦:

http://blablalba.com/foo/bar_soap/foo/dir2
http://blablalba.com/foo/bar_soap/dir
http://blablalba.com/foo/bar_soap

私の正規表現:

\/foo\/(.*)

これは以下を返します:

/foo/bar_soap/dir/dir2
/foo/bar_soap/dir
/foo/bar_soap

でも欲しいだけ

/foo/bar_soap

これを達成する方法はありますか?上に示したように、最初のスラッシュまでの foo 以降のすべてが必要です。

前もって感謝します。

編集。foo次のスラッシュまでの後のテキストのみが必要です。一部のディレクトリには as という名前が付けられている場合がありfoo、これにより誤った結果が表示されます。ありがとう

4

3 に答える 3

2

.[^/]何にでも一致するので、代わりに(スラッシュではなく)に変更する必要があります。

\/foo\/([^\/]*)

他の回答のいくつかは、の+代わりに使用し*ます。やりたいことによっては正しいかもしれません。を使用+すると、正規表現が少なくとも1つの非スラッシュ文字と一致するようになります。したがって、スラッシュの後に末尾の文字がないため、このURLは一致しません。

http://blablalba.com/foo/

代わりに使用*すると、「ゼロ以上」の非スラッシュ文字に一致するため、一致させることができます。したがって、使用する必要があるかどうか、+または*許可する一致に依存します。

アップデート

クエリ文字列も除外する場合?は、すべてのクエリ文字列の先頭にある必要があるに対してフィルタリングすることもできます。(以下に投稿した例では、実際には先頭が欠落していると思います?):

\/foo\/([^?\/]*)

splitただし、独自のソリューションを展開するよりも、URIモジュールから使用する方がよい場合があります。URLのパス部分URI::splitを取得するために使用し、次にそれをで分割して、最初の部分を取得することができます。これは、URLのすべての奇妙なケースを処理します。おそらくまだ知らないものは、指定されたフラグメントを含むURLです。例:String#split/

http://blablalba.com/foo#bar

#これらも処理するには、フィルター処理された文字クラスに追加する必要があります。

于 2013-03-05T16:16:36.033 に答える
1

\/foo\/([^\/]+)

[^\/]+スラッシュではない一連の文字を提供します。

括弧により、正規表現エンジンは一致したコンテンツをグループに保存するため、一致全体から([^\/]+)抜け出すことができますbar_soap/foo/bar_soap

たとえば、javascript では、次のように一致したグループを取得します。

regexp = /\/foo\/([^\/]+)/ ;
match = regexp.exec("/foo/bar_soap/dir");
console.log(match[1]);  // prints bar_soap
于 2013-03-05T16:13:15.553 に答える
1

この正規表現を試すことができます

/\/foo\/([^\/]+)/
于 2013-03-05T16:13:27.773 に答える