4

正規表現を使用して文字列の一部を抽出しようとしています。文字列には次のケースがあります。

case1: Warehouse.13.season01episode01.hdtv.xor.avi
case2: Warehouse.13.s01e01.hdtv.xor.avi
case3: Warehouse.13.01x01.hdtv.xor.avi

上記delimter(.)の文字列の は に置き換えることができます\s - _

使用しているロジックはs or season、数字で先行(後読み)されているかどうかをチェックし、その前にすべてを抽出しますが、後読みには絶対長が必要なため、文字列を逆にして先読みを使用しました。

ここで、case1 について、正常に動作し、出力する以下の正規表現を作成しましたWarehouse.13

.*?\d{1,2}e\d{1,2}s\.(?=\d+)(.*)

今case2のために私が使用した:

.*?\d{1,2}edosipe\d{1,2}nosaes\.(?=\d+)(.*) # works fine.

上記の 2 つのケース + オプションの区切り記号を次のように組み合わせようとすると、次のようになります。

.*?\d{1,2}[e|edosipe]?[._ x\-]?\d{1,2}[s|nosaes]?[._\- ]?(?=\d+)(.*)

上記の場合、ほとんどのものはオプティカル (?) であることがわかります。case3用です。

上記の正規表現を使用しても、case2 には一致しませんが、case1 と case3 では正常に機能します。

ここで何が間違っているのか考えてください。

PS:上記の正規表現に逆らう可能性のある他の文字列がある可能性があることは承知していますが、現在それらには興味がありません。

4

1 に答える 1

5

[e|edosipe]正規表現エンジンがそれらをキャプチャして、、などのアカウンティングを台無しにしたくない場合は、and 、またはandで[s|nosaes]ある必要があります。(e|edosipe)(s|nosaes)(?:e|edopise)(?:s|nosaes)$1$2

ここで(...)は、Perl の他の式と同じように括弧によるグループ化を行います。 [...]文字クラスを定義します。具体的には、、、、、、、および (おそらく驚くべきことに、メタ文字の特殊な意味は ] 内では通常無視されます) 、のいずれ[s|nosaes]かの単一文字に一致します。aenos[...|

于 2012-09-16T07:19:30.837 に答える