2013-05-29 64 views
0

我有一個包含超過800萬個文件的驅動器,它是CRM系統的文件存儲區域。這些文件以特定的格式存儲,並且每個文件都應該在數據庫中具有匹配的記錄。然而,由於一些非常差的安全性,世界和妻子也一直在同一個驅動器上創建文件。我的任務是確定使用Powershell和正則表達式的無效文件。 典型有效的文件路徑將會是這個樣子:正則表達式需要匹配從文件名派生文件路徑的文件路徑。

P:\PERSON\06\19\09\619090.5577930.DOC 

所有文件都被稱爲P驅動的:它包含四個子目錄叫:事件OPPORTUN,ORGANISA或個人。其中每一個都包含可變數目的子目錄,名稱範圍從00到99,文件名是由句點分隔的兩組數字,後跟擴展名。

我使用匹配這個模式的正則表達式是:

^P:\\(EVENT|OPPORTUN|ORGANISA|PERSON)\\(\d{2}\\)+\d+\.\d+\.\w{3,4}$ 

併發症是有效的文件也具有第一組中的文件名數字,這是子目錄路徑之間的關係這個:

刪除最後一位數字。

如果數字的長度現在是奇數,則添加前導零。

將結果數字分成兩對,應該是路徑。

因此,使用上面的例子:

第一組數字是:619090

刪除最後一個數字:61909

的長度爲奇數,以便添加一個前導零:061909

劃分成對:06 \ 19 \ 09

我的問題是這個邏輯可以合併到我的正則表達式中,有沒有辦法使用forward或b ack參考?

回答

0

傑裏的回答指出我正確的方向,並發現你可以捕獲包含在非捕獲組中的組。下面是我的正則表達式連同幾個測試:

$samples = @() 
$samples += 'P:\PERSON\06\19\09\619090.5577930.DOC' #good 
$samples += 'P:\PERSON\19\09\19090.5577930.DOC' #good 
$samples += 'P:\PERSON\10\10\10\06\19\09\1010100619090.5577930.DOC' #good 
$samples += 'P:\PERSON\06\19\09\619090a.5577930.DOC' #bad 
$samples += 'P:\PERSON\06\19\09\61909090.5577930.DOC' #bad 
$samples += 'P:\PERSON\06\19\09\6190905577930.DOC' #bad 

$regex = '^P:\\(?:EVENT|OPPORTUN|ORGANISA|PERSON)\\' 
$regex += '(?:(\d)(\d)\\|0(\d)\\)(?:(\d{2})\\)?(?:(\d{2})\\)?(?:(\d{2})\\)?(?:(\d{2})\\)?(?:(\d{2})\\)?' 
$regex += '(?:\1\2|\3)\4?\5?\6?\7?\8?\d?\.\d+\.\w{3,4}$' 

$samples | % { 
    $_ -match $regex 

} 
2

我試圖來的東西,如果PowerShell支持反向引用,你可以試試這個:

^P:\\(?:EVENT|OPPORTUN|ORGANISA|PERSON)\\(?:0(\d)|(\d{2}))\\(\d{2})\\(?P<t>\d{2})\\(?:(?:\1|\2)\3\4)0?\.\d+\.\w{3,4}$

\1\4指早期發現,不同的捕捉組。

我測試了一些字符串regex101

唯一的是它也會接受P:\OPPORTUN\61\90\90\619090.5577930.DOC 我不太清楚如何僅用一個正則表達式來解決這個問題......或者使正則表達式比現有的更長(比這可能多兩倍)。

它是關於只要如果你想真正做到了兩次:

^P:\\(?:EVENT|OPPORTUN|ORGANISA|PERSON)\\0(\d)\\(\d{2})\\(\d{2})\\(?:\1\2\3)0\.\d+\.\w{3,4}|P:\\(?:EVENT|OPPORTUN|ORGANISA|PERSON)\\(\d{2})\\(\d{2})\\(\d{2})\\(?:\4\5\6)\.\d+\.\w{3,4}$

編輯:最多7對數字:

^P:\\(?:EVENT|OPPORTUN|ORGANISA|PERSON)\\(?:0(\d)|(\d\d))\\(?:(\d\d)\\)?(?:(\d\d)\\)?(?:(\d\d)\\)?(?:(\d\d)\\)?(?:(\d\d)\\)?(?:(?:\1|\2)\3?\4?\5?\6?\7?)0?\.\d+\.\w{3,4}

+1

感謝這個,你的解決方案是不完全正確,但我指出了正確的方向,因爲我不知道,你可以有非捕獲組。 –

+0

@DaveSexton哦!你可能有多次出現的'\ d \ d \ /'。那麼,我很高興能以某種方式獲得幫助:)雖然看看你的正則表達式,但通過將'(\ d)(\ d)'分爲'(\ d \ d)'和你將只需要一個反向參考爲他們每個人:) – Jerry

相關問題