3

一致しない1 文字以上の長さのものに一致する単一の正規表現を探してい500ます。これは、特に例外を処理するために、Rails ルート ファイルで使用されます。

ルート.rb

match '/500', to: 'errors#server_error'
match '/:anything', :to => "errors#not_found", :constraints => { :anything => /THE REGEX GOES HERE/ }

何かに一致し、同時に他の何かに一致しない正規表現を定義する方法について少し迷っています。

4

4 に答える 4

2

この正規表現を使用して、文字列に部分文字列 500 が含まれていないかどうかを確認できます。

\A(?>[^5]++|5++(?!00))+\z

5000 または 5500 を許可する場合は、次のようにします。

\A(?>[^5]++|5{2,}+|5(?!00(?!0)))+\z

最初の文字列の説明:

\A           # begining of the string
(?>          # opening of an atomic group
   [^5]++    # all characters but 5 one or more times (possessive)
  |          # OR
   5++(?!00) # one or more 5 not followed by 00
)+           # closing of the atomic group, one or more times
\z           # end of the string

所有量指定子アトミック グループは、正規表現エンジンのバックトラックを回避してパフォーマンスを向上させるためにここにあります (正規表現はすぐに失敗します)。

于 2013-06-13T14:32:40.980 に答える
1

Rails ルートは、routes.rb に表示される順序で照合されます。リスト/500の最初 (または上位) に配置することで、それより下のルートが一致しないことが保証されます/500。これについて心配する必要はありません。

代わりに、これを複数のルートに分割します。

match '/500', to: 'errors#server_error'
match '.*500.*', to: 'somewhere else'
match '/:anything', :to => "errors#not_found"

制約について心配する必要はありません。

于 2013-06-13T15:02:42.530 に答える
1

その正規表現が本当に必要ですか? ルート定義

match '/500', to: 'errors#server_error'

これらのリクエストをすべてキャッチ/500し、次のルートルールを意味します

match '/:anything', :to => "errors#not_found"

それらを自動的に取得しません。

于 2013-06-14T08:56:30.497 に答える
0

コメントで述べたように、この正規表現は仕事をするはずです\A(?!500\z).+\z

説明

  • \A: 行頭に一致
  • (?!500\z): 否定先読み。つまり、500 + 行末がないかどうかを確認します。\z
  • .+: 任意の文字に 1 回以上一致
  • \z: 行末に一致
于 2013-06-13T21:17:00.973 に答える