0

私は正規表現で非常に迷っています。それは私にとってただの黒魔術です。必要なものは次のとおりです。

  • ファイル名があります: some_file.jpg
  • 次の形式になっている可能性があります: some_file_p250.jpg
  • ファイルに一致する単純な形式の正規表現: /^([a-zA-Z_-0-9]+).(jpg|jpeg|png)$/
  • 高度な形式のファイルに一致する正規表現: /^([a-zA-Z_-0-9]+)(_[az]?[0-9]{2,3}).(jpg|jpeg|png )$/

私の質問は次のとおりです。「(_[az]?[0-9]{3,4})」の部分をオプションにするにはどうすればよいですか? 次のように、2 番目のグループに疑問符を追加してみました。

/^([a-zA-Z_\-0-9]+)(_[a-z]?[0-9]{3,4})?\.(jpg|jpeg|png)$/

パターンは機能しますが、常に最初のグループの 2 番目のグループのコンテンツをキャプチャし、2 番目のグループは空のままにします。

ファイル名、高度な部分 (_p250)、および拡張子を個別にキャプチャするにはどうすればよいですか? 最初のグループの貪欲さが関係していると思いますが、私は完全に間違っている可能性があり、たとえ私が正しいとしても、それを解決する方法はまだわかりません.

ご感想ありがとうございます

4

2 に答える 2

0

最初のプラスの後に疑問符を追加すると、最初のキャプチャ式が非貪欲になります。これは、テストケースを使用してうまくいきました:

/^([a-zA-Z_\-0-9]+?)(_[a-z]?[0-9]{3,4})?\.(jpg|jpeg|png)$/

PHPではなくJavascriptでテストしましたが、これが私のテストです:

"some_file_p250.jpg".match(/^([a-zA-Z_\-0-9]+?)(_[a-z]?[0-9]{3,4})?\.(jpg|jpeg|png)$/)

そして私の結果:

["some_file_p250.jpg", "some_file", "_p250", "jpg"]

私の経験では、キャプチャ式を非貪欲にすることで、正規表現がより直感的になり、多くの場合、期待どおりに動作するようになります。あなたの場合、それはあなたが疑ったことをしていました。最初の式はすべてをキャプチャしていましたが、2 番目の式には何もキャプチャする機会がありませんでした。

于 2013-02-15T17:33:17.510 に答える
0

これがあなたが望むものだと思います:

/^([a-zA-Z_\-0-9]+)(|_[a-z]?[0-9]{3,4})?\.(jpg|jpeg|png)$/

また

/^([\d\w\-]+)(|_[a-z]?[0-9]{3,4})\.(jpg|jpeg|png)$/
于 2013-02-15T17:27:03.013 に答える