4

私たちのWebアプリケーションでは、ユーザーが独自の「スラッグ」を指定できます。これには、相対パス(/somedir/some-file.htmなど)を含めることができます。

ルーティング構成では、有効なスラッグ(セグメントを含む)のみがサポートされていることを確認する必要があります。

私が使用している正規表現は次のとおりです。

(^[a-z0-9])([a-z0-9-/]+)([a-z0-9])$

これの意味は:

  • 有効なスラッグは、たとえばsome-file.htmと一致します。
  • セグメント(相対パス)を持つ有効なスラッグは、たとえばsomedir / subdir/some-file.htmと一致します。
  • 絶対URLは一致しません(例:/somedir/some-file.htm)
  • 末尾の/または-は一致しません(例:-slug-)

残念ながら、これは、式が1つ以上のスラッシュを許可しているため、たとえばsomedir // subdir//some-file.htmなどの二重スラッシュが一致することも意味します。

セグメント間にゼロ以上のスラッシュを許可するように変更するにはどうすればよいですか。

私はそれを考えました:

(^[a-z0-9])(/?[a-z0-9-]+/?)([a-z0-9])$

動作しますが、動作しません。

4

4 に答える 4

5

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$

編集:最初の正規表現が好きな場合は、これを使用してください:

^(?!-)[a-z0-9-]+(?<!-)(/(?!-)[a-z0-9-]+(?<!-))*$

面倒で複雑に見えますが、仕様からすると正しいようです。

[a-z0-9]([a-z0-9-]*[a-z0-9])?

単一の名前に一致します。/現時点ではsを無視します。

次に、残りの部分は1つのスラッシュで、その後に同じものが続きます。

Karolyの回答で述べたように、これにはリテラルピリオドは含まれません。たとえば、「some-file.htm」は私が書いた正規表現と一致しません。

これが望ましい動作である場合は、実際には次のことが必要になります。

^[a-z0-9]([a-z0-9-\.]*[a-z0-9])?(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)*$

最後に、最後のセクションでのみリテラルピリオドを許可する場合は、次のようにします。

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)?$

編集:

これは先読みと後れを使用して少し単純化できると考えられます。

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)?$

になります:

^(?!-)[a-z0-9-]+(?<!-)(/(?!-)[a-z0-9-]+(?<!-))*(/(?!-\.)[a-z0-9-\.]+(?<!-\.))?$

于 2012-07-08T12:13:45.010 に答える
1
(^[a-z0-9]+)(/[a-z0-9-]+)*([a-z0-9])$

.注:正規表現には表示されません。

個人的には、最初と最後の文字を別々にテストして、正規表現をよりシンプルで使いやすくします。

于 2012-07-08T11:59:38.423 に答える
0

有効なパスを確認します (相対パスまたは絶対パス。ドットは隠しフォルダー用です)。
^([a-z]:)*(\/*(\.*[a-z0-9]+\/)*(\.*[a-z0-9]+))

于 2015-06-23T08:01:35.737 に答える
0

私の要件は非常に異なっていたので、ここに投稿された正確な質問と要件に答えるのではなく、答えを探してここに来る他の人に答えています.

私の要件:

  • 同じ文字列内の複数のパスと照合する必要がありました
  • ./各パスは、またはのいずれかで始まることが知られていました../
  • サポートされていないため、後読みを使用できませんでした
  • 各パスが新しい行にあることがわかっていました
  • フォルダは常に 1/文字で区切られていました。

これは私が思いついたものです(JS RegEx構文に基づく):

私の解決策

/\.\.?\/[^\n"?:*<>|]+\.[A-z0-9]+/g

これを例として使用して説明します。

../path/to/file.ext lorem ipsum テキスト

  • /..../g正規表現が同じ文字列内で複数回一致することを意味します
  • \.\.?\/../と の両方に一致./

    /\.\.?\//g

    ../path/to/file.ext lorem ipsum テキスト

  • [^\n"?:*<>|]+一致しない文字のブラック リストです。
    • [^....]= この文字リストと一致しません。
    • \n= 新しい行 (パスが同じ行に表示されることはありません)
    • 他のすべての文字はリテラルです。これらは不正なファイル名文字です。

      /\.\.?\/[^\n"?:*<>|]+/g

      ../path/to/file.ext lorem ipsum text

  • \.[A-z0-9]+ファイル拡張子の最後で停止することを確認することです。

    /\.\.?\/[^\n"?:*<>|]+\.[A-z0-9]+/g

    ../path/to/file.extlorem ipsum テキスト

于 2018-09-25T11:01:05.577 に答える