2

これらの条件を持つファイル パスの正規表現にたどり着きました。

  • regex^(\\\\[^\\]+\\[^\\]+|https?://[^/]+)と一致する必要があるため、\server\share (オプションで 1 つ以上の「\folder」が続く) のようなもの、または HTTP(S) URL のいずれか
  • パス名に無効な文字 (",<,>, |) を含めることはできません

これらの条件を満たす単一の正規表現を angular.js で使用するにはどうすればよいですか

4

3 に答える 3

0

現在の正規表現は、あなたが望むものと一致していないようです。しかし、それがあなたが望むことを正しく行っているとすれば、これは否定を追加します:

^(?!.*[ "<>|])(\\\\[^\\]+\\[^\\]+|https?://[^/]+)

ここでは、一致に失敗する文字が文字列に含まれているかどうかを確認するために、否定的な先読みを追加しました。何も見つからない場合は、残りの正規表現が続行されます。

あなたの要件を正しく理解していれば、おそらくこれを行うことができます:

^(?!.*[ "<>|])(\\\\|https?://).*$

これでも、否定先読みで定義された無効な文字には一致せず、1 つ以上のパス セグメントと http(s) に一致するという基準も満たしており、はるかに単純です。

問題は、2 つ以上のパス セグメントが必要な場合、または URL の末尾にスラッシュが必要な場合、これは機能しないということです。これは、正規表現が示唆しているようです。

その場合、これはまだオリジナルよりもいくらかきれいです

^(?!.*[ "<>|])(\\\\[^\\]+\\.|https?://[^/]+/).*$

もう1点。と一致するように要求し\server\shareますが、正規表現は で始まります\\\\\server\share私はそうあるべきだと仮定し、\\server\shareそれに応じて正規表現を書きました。そうでない場合は、\\\\私が示した例のすべてのインスタンスを次のように変更する必要があります。\\

于 2015-12-09T08:02:24.437 に答える
0

わかりました、最初に正規表現、説明より:

(?<folderorurl>(?<folder>(\\[^\\\s",<>|]+)+)|(?<url>https?:\/\/[^\s]+))

最初の条件は、",<>|" の文字を含まないフォルダー名に一致させることです。空白でもありません。これは次のように書かれています。

[^\s,<>|] # the caret negates the character class, meaning this must not be matched

さらに、必要に応じて別の (サブ) フォルダーが続くフォルダー名と一致させたいので、文字クラスにバックスラッシュを追加する必要があります。

[^\\\s,<>|] # added backslash

ここで、できるだけ多くの文字に一致させたいと考えていますが、少なくとも 1 つの文字に一致させる必要があります。これがプラス記号 ( +) です。これを念頭に置いて、次の文字列を検討してください。

\server\folder

現時点では、"server" のみが一致するため、前にバックスラッシュを追加する必要があるため、"\server" が一致します。ここで、ファイルパスを分割すると、常にバックスラッシュ + somefoldernameで構成されるため、バックスラッシュ + somefoldernameを無制限に一致させる必要があります(ただし、最低 1 回):

(\\[^\\\s",<>|]+)+

これはやや読みづらくなってきたので、名前付きのキャプチャ グループ ( (?<folder>))を使用しました。

(?<folder>(\\[^\\\s",<>|]+)+)

\serverこれはorのようなものすべてにマッチ\server\folder\subfolder\subfolderし、 というグループに保存しfolderます。

今度は URL 部分です。URL は、http または https の後にコロン、2 つのスラッシュ、および「その後の何か」で構成されます。

https?:\/\/[^\s]+ # something afterwards = .+, but no whitespaces

上記の説明に従って、これは「url」と呼ばれる名前付きグループに保存されます。

(?<folder>(\\[^\\\s",<>|]+)+)

ただし、これは無効な URL 文字列 (例: ) にも一致することに注意してください。これで問題https://www.google.com.256357216423727...ない場合はそのままにしておきます。そうでない場合は、SO でこの質問をご覧ください

最後になりましたが、2 つの要素をorで結合し、別の名前付きグループ (folderorurl) に保存して完了です。シンプルですね。

(?<folderorurl>(?<folder>(\\[^\\\s",<>|]+)+)|(?<url>https?:\/\/[^\s]+))

これで、パーツをまたはに保存しながら、フォルダーまたはURL をグループ内で見つけることができます。残念ながら、私は angular.js について何も知りませんが、正規表現から始めることができます。さらに、動作するフィドルについては、このregex101 デモを参照してください。folderorurlurlfolder

于 2015-12-09T07:51:02.790 に答える