2011-09-15 14 views
0

次の例のファイルパスを解析し、次の表に示すように、パス、base、extおよびnumを返す正規表現が必要です。これらのサンプルファイルパスを解析できる正規表現

この正規表現はほとんど動作しますが、ファイル名に複数のピリオドが含まれていると、残念ながら短くなります。ここで

^(.*\\)?(.*?)\.(.*?)\.?([0-9]+)?$ 

input       path   base   ext  num 
--------------------------- ------------ ----------  ------ ------ 
c:\temp\00883005.prt.1  c:\temp\  00883005  prt  1 
00883005.prt         00883005  prt 
00883005.prt.1        00883005  prt  1 
\\data\test\00883005.prt  \\data\test\ 00883005  prt 
\\data\test\00883005.prt.1 \\data\test\ 00883005  prt  1 
00883005.test.prt        00883005.test prt   
00883005.test.prt.1       00883005.test prt  1 
c:\temp\00883005.test.prt.1 c:\temp\  00883005.test prt  1 
00883005.mp3         00883005  mp3  

作業AutoHotkeyをコードは(下の人々のおかげで)です:

RegExMatch(filename, "^(.*\\)?(.*?)\.([^\.]*?)\.?(\b[0-9]+)?$", data) 
outputdebug % "dir = " data1 
outputdebug % "base = " data2 
outputdebug % "ext = " data3 
outputdebug % "num = " data4 
+1

あなたが何語これでやっている?それを行うもっと良い方法があるかもしれません。 –

+0

私はAutoHotkeyを使用しています – panofish

答えて

2

は、このバージョンをお試しください:

^(.*\\)?(.*?)\.([^\.]*?)\.?([0-9]+)?$ 

差は最後から2番目のグループであります: ([^\.]*?)(.*?)に変更し、ドットがマッチに含まれないようにしました。

提供されたデータに対して偉大なwww.regexplanet.comでテストされました。

+0

優秀ですが、mghicks応答を読んだ後、この例をテスト00883005.mp3に追加し、この正規表現はext = mpとnum = 3を返します。 ext = mp3とnum = NULLを返す必要がありますか? – panofish

+0

それから、 '[0-9]'の前に '\ b'を追加してください。 –

+0

それはうまくいくようです...ジェンス・ホフマン、mghicks、Tim Pietzckerに感謝します。これは正規表現です^(。* \\)?(。*?)\。([^ \。] *?)\。?(\ b [0-9] +)?$ – panofish

0

あなたは、単にベース名にに追加することにより、複数のピリオドを収容することができますように思える:

^(.*\\)?(.*?)\.((.*?)\.?)+([0-9]+)?$ 
0

あなたはextは数字が含まれません保証することができます場合は、

^(.*\\)?([^\\]+)\.([^.0-9]+)(?:\.([0-9]+))?

関連する問題