2017-09-27 16 views
2

パスの最後にオプションのパラメータと一致する正規表現を作成しようとしています。
は、私が最初の4つのパスをカバーしたいではなく、最後の1:これまでのところ、私が作成したオプションパラメータと一致する正規表現

/main/sections/create-new 
/main/sections/delete 
/main/sections/ 
/main/sections 
/main/sectionsextra 

この:これは最初の3見つけ

/\/main\/sections(\/)([a-zA-z]{1}[a-zA-z\-]{0,48}[a-zA-z]{1})?/g 

私はそれをどのように作ることができます最初の4つのケースに一致しますか?

答えて

2

あなたは、最大文字列の最後にそれの後/以外の任意の1つのまたは以上の文字で/で始まる質問にオプションの文字列を文字列を一致させることがあります。

\/main\/sections(?:\/[^\/]*)?$ 
       ^^^^^^^^^^^^^^ 

regex demoを参照してください。あなたが本当に、唯一ただ文字と(文字2+の長さ)の開始/終了時に許可されていない--から成るように、オプションのサブパートを制約

/\/main\/sections(?:\/[a-z][a-z-]{0,48}[a-z])?$/i 

を使用したりする必要がある場合、また1を可能にします文字サブパート:

/\/main\/sections(?:\/[a-z](?:[a-z-]{0,48}[a-z])?)?$/i 

詳細

  • \/main\/sections - リテラルストリング-
  • (?:\/[^\/]*)?の1つの又は0の出現一致任意の非捕捉基:
    • \/を - /チャー
    • [^\/]* - 任意に一致否定文字クラス0+ /
  • 以外の文字
  • $ - 文字列の最後。

JSのデモ:

var strs = ['/main/sections/create-new','/main/sections/delete','/main/sections/','/main/sections','/main/sectionsextra']; 
 
var rx = /\/main\/sections(?:\/[^\/]*)?$/; 
 
for (var s of strs) { 
 
    console.log(s, "=>", rx.test(s)); 
 
}

+1

はい、それは動作します。オプションの部分がスペースで区切られていれば、それにもマッチします。 – Reyraa

+1

@Reyraa最後のサブパートに空白を入れることはできないのですか? '\ s'を否定文字クラス' [^ \ /] '=>' [^ \/\ s] 'に追加するだけです。また、['[A-Z]'が文字以外のものにマッチすることを忘れてしまった(https://stackoverflow.com/questions/29771901/why-is-this-regex-allowing-a-caret/29771926#29771926)。私はあなたがここでどのくらい制限にいくことができるかを示すバリエーションをいくつか追加しました。 –

関連する問題