正则表达式并忽略空格

时间:2011-04-25 20:32:01

标签: regex scripting powershell powershell-v2.0

我有以下正则表达式,我用来匹配文件的字符串搜索中的各种信用卡号码。但是,如果要匹配的模式之前或之后有空格,则匹配将失败。

$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 

在底部三个中,第一个在其末尾有一个空格,第二个在它之前有一个空格,第三个在它之前和之后有一个空格。

提前感谢您的帮助。

5 个答案:

答案 0 :(得分: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}$'

毕竟,谁知道人们可能有什么想法进行格式化 - 组之间有几个空格,空格和破折号等等......

答案 1 :(得分:1)

我不知道在PowerShell中如何具体执行此操作,但使用某种replace()函数来摆脱空格(或PowerShell中的等效项)会更容易。

replace(' ', '');

编辑:实际上,首先删除所有不是一个数字更有意义。你可以轻松地使用RegEx做到这一点:

[^0-9]+

答案 2 :(得分:1)

$CC_Regex = "^\s*(\d{4}-){3}\d{4}\s*$|^\s*(\d{4} ){3}\d{4}\s*$|^\s*\d{16}\s*$"
即使存在前导空格或尾随空格,

也会使其匹配(\s表示任何空白字符)。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这个^(?<myregex>\s{0,}\d{4}-{0,}\s{0,}\d{4}-{0,}\s{0,}\d{4}-{0,}\s{0,}\d{4}).*?