2011-04-25 390 views
1

我有以下正則表達式,我正在使用它來匹配文件的字符串搜索中的各種信用卡號碼。但是,如果模式匹配前後有空格,則匹配將失敗。正則表達式並忽略空白

$CC_Regex = "^(\d{4}-){3}\d{4}$|^(\d{4}){3}\d{4}$|^\d{16}$" 

例如,它將匹配前三名,但不匹配下三名。

1111-2323-2312-3434 
1234343425262837 
1111 2323 2312 3434 

1111-2323-2312-3434 
1234343425262837 
1111 2323 2312 3434 

出了底部的三個中,第一個具有在它的端部的空間,第二個面前有一空間,以及之前和之後它的第三個有一個空間。

在此先感謝您的幫助。

+0

這很重要,我在Windows PowerShell中使用它。 – John 2011-04-25 20:32:35

回答

9

這將是很容易擴充正則表達式在前面處理的空白,並結束:

^\s*(?:(\d{4}-){3}\d{4}|(\d{4}){3}\d{4}|\d{16})\s*$ 

,但它似乎更謹慎拿字符串,刪除除數字的一切,然後檢查它是否是一個16位編號:

$result = $subject -creplace '[^0-9]+', '' 
$found = $result -cmatch '^[0-9]{16}$' 

畢竟,誰知道有什麼想法的人可能有格式 - 羣體之間的幾個空格,空格和破折號等混合...

+0

你幾秒鐘就打敗了我。 :) – Compeek 2011-04-25 20:37:25

+0

@Tim - 感謝您的信息。我只是測試了這一點,它似乎趕上了匹配字符串末尾有一個空格的情況。它似乎沒有捕獲匹配字符串之前有空格或匹配字符串之前和之後都有空格的情況。 – John 2011-04-25 21:20:50

+0

@Tim - 我不確定是否能夠執行PowerShell中提到的第二項。無論如何,這似乎是一個非常有用的觀點。 – John 2011-04-25 21:34:39

1

我不知道如何專門在PowerShell中執行此操作,但使用某種替換()函數來擺脫空格(或PowerShell中的等效項)會更容易。

replace(' ', ''); 

編輯:事實上,它會更有意義刪除一切這不是一個數字第一。你可以做到這一點與正則表達式容易:

[^0-9]+ 
1
$CC_Regex = "^\s*(\d{4}-){3}\d{4}\s*$|^\s*(\d{4}){3}\d{4}\s*$|^\s*\d{16}\s*$" 

將使其匹配即使開頭或結尾whitepsace存在(\s意味着任何空白字符)。

+0

感謝您的信息。我只是測試了這一點,它似乎趕上了匹配字符串末尾有一個空格的情況。它似乎沒有捕獲匹配字符串之前有空格或匹配字符串之前和之後都有空格的情況。 – John 2011-04-25 21:21:06

+0

@John,我糾正了正則表達式。感謝您指出錯誤,並首先爲您提供錯誤答案而感到遺憾。 – 2011-04-25 23:44:55

0
$CC_Regex = "(?:\d{4}[- ]?){3}\d{4}"