2017-04-19 137 views
1

我需要使用perl來檢查文件名是否匹配格式。用特定的起始字符串和結束字符串檢查文件名?

example: test1_ab_pls_20170418.csv 
1. test1_ab_pls_ is fixed, and the file name will start with it. 
2. 20170418 is date, those will be numbers 
3. .csv is ending string 

我已經試過正則表達式像

$oldfile=~ m/^(test1_ab_pls_)\d(.csv)$/ 

,但失敗了。我如何修改它?

+0

您有關於'\ d {8}'的答案,但是請注意,如果您只需檢查該字符串的格式,則不需要括號。括號「_capture_」匹配,以便它可以返回,或用於$ 1,$ 2 ...變量。 – zdim

回答

4

您需要爲\ d添加一個量詞,{8}只會匹配一行中的8位數字。

$oldfile=~ m/^(test1_ab_pls_)\d{8}(.csv)$/ 

對正則表達式的更多詳細信息,請參閱Perlre

+0

它的工作原理。非常感謝! – kirrame1100

2

這應該這樣做

\w{4}\d\_\w{2}\_\w{3}\_\d{8}[.csv|.CSV]+

演示

https://regex101.com/r/JVKZYP/3

enter image description here

\w{4}匹配任何字字符(等於[a-zA-Z0-9_]{4}相配正好是4倍
\d一個數字匹配(equal to [0-9]
\_的字符相匹配_字面上(區分大小寫)
\d{8}數字(equal to [0-9]{8}相配正好是8倍
[.csv|.CSV]匹配單個字符在列表.csv|CSV(區分大小寫)


匹配

或修復您的[test1_ab_pls_]+\d{8}(.csv)


或者另一場比賽https://regex101.com/r/cAKUQN/1

\w{4}\d\_\w{2}\_\w{3}\_(20\d{2})(\d{2})(\d{2})[.csv|.CSV]+


對於確切的日期([2017]{4})([04]{2})([18]{2})

+0

如果日期會特別檢查? – ssr1012

+0

對不起:(你的意思是? – 0m3r

+0

只是一個問題,如果OP檢查日期或昨天的日期,它將與你提供的正則表達式匹配如果他想要特定的日期或確切的日期可用CSV格式的多個文件是正則表達式將失敗 – ssr1012

0

這不太好,但這是另一種方式。

if (index($oldfile, 'test1_ab_pls_') == 0 
    && rindex($oldfile, '.csv') == length($oldfile) - 4) 
{ print "It matches!" } 

我對它進行了基準測試,它比Fashim的正匹配正則表達式快,但對於負面匹配比較慢。

相關問題