2017-12-04 22 views
1

私は、正規表現を作成して、インデックスのURL(パラメータの有無にかかわらず)をレールに一致させようとしています。正規表現に一致する正規表現は、インデックスURLを取得

私は何を期待以下の3試合:

regex = /^http:\/\/localhost:3000\/v2\/manufacturers\/?(\S+)?$/ 
regex.match?('http://localhost:3000/v2/manufacturers?enabled=true') 
#=> true 
regex.match?('http://localhost:3000/v2/manufacturers/') 
#=> true 
regex.match?('http://localhost:3000/v2/manufacturers') 
#=> true 

私は正規表現がこれらと一致しないことを期待:

regex.match?('http://localhost:3000/v2/manufacturers/1') 
#=> true 
regex.match?('http://localhost:3000/v2/manufacturers/123') 
#=> true 
regex.match?('http://localhost:3000/v2/manufacturers/1?enabled=true') 
#=> true 

編集:

はごめんなさいしかし、私が忘れてしまいました一致する必要があることを記載してください:

regex.match?('http://localhost:3000/v2/manufacturers/1/models') 

それが有効なインデックスのURL

+0

nilのあなたの質問は何ですか? – sawa

+1

@WiktorStribiżewdone、thanks – fabriciofreitag

答えて

1

あるとしてあなたは

/\Ahttp:\/\/localhost:3000\/v2\/manufacturers(?:\/?(?:\?\S+)?|\/1\/models\/?)?\z/ 

Rubular demo

パターンが

  • \Aの詳細を参照してください使用することができます - 文字列
  • http:\/\/localhost:3000\/v2\/manufacturersの開始を - http://localhost:3000/v2/manufacturersストリング
  • (?:\/?(?:\?\S+)?|\/1\/models)? - の任意の配列:
    • \/? - 任意/チャー
    • (?:\?\S+)?から?の任意の配列と1+非空白
    • |
    • - 又は
    • \/1\/models\/? - /1/models文字列とオプションの/末尾に
  • \z - 文字列の最後。
+0

'http:// localhost:3000/v2/manufacturers /?enabled = true'を無視しますか? – revo

+0

その '/? 'をマッチングする必要がある場合、非捕捉グループは['(?:\/| \ /?\?\ S +)?]](http://rubular.com/r/ PMNUrtO1m3)。またはOPは['\ Ahttp:\/\/localhost:3000 \/v2 \/manufacturers \ /?(?:\?\ S +)?\ z'](http://rubular.com/r/GKk13h7Ze3 )。 –

+0

コメントを編集してはいけません。 ;) – revo

1

あなたは、あなたからの正規表現の終わりを変更することができます:に

\/?(\S+)?$/ 

:オプションの非キャプチャグループ(?:\?\S+|\d+\/\S+)?を作成します

\/?(?:\?\S+|\d+\/\S+)?$ 

。あなたのquestionmarkと非空白文字のため

  • マッチ\?\S+
  • または|
  • マッチ\d+\/\S+?文字が文字はオプションになり1/models

Demo

+0

より良いアプローチ。 – revo

+0

@WiktorStribiżewによって下降された理由はありません。 ©著作権所有。 – revo

関連する問題