【问题标题】:Regex and ignore whitespace正则表达式并忽略空格
【发布时间】:2011-08-12 13:55:00
【问题描述】:

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

$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 

在最下面的三个中,第一个在它的末尾有一个空格,第二个在它之前有一个空格,第三个在它的前后都有一个空格。

提前感谢您的帮助。

【问题讨论】:

  • 重要的是,我在 Windows PowerShell 中使用它。

标签: regex scripting powershell powershell-2.0


【解决方案1】:

增加正则表达式以处理前端和末尾的空格很容易:

^\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}$'

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

【讨论】:

  • 你秒杀我。 :)
  • @Tim - 感谢您提供的信息。我刚刚对此进行了测试,它似乎捕捉到了匹配字符串末尾有一个空格的情况。它似乎没有捕捉到匹配字符串之前有空格或匹配字符串前后都有空格的情况。
  • @Tim - 我不确定是否能够执行您在 PowerShell 中提到的第二项。无论如何,这似乎是一个非常有效的观点。
  • @Tim,你犯了和我在回答中一样的错误——你没有注意到正则表达式中有$|^s,所以必须在更多地方添加\s*
  • @Jakub:哦,对了。谢谢!但是我没有添加更多的\ss,而是删除了现在多余的^s 和$s。
【解决方案2】:

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

replace(' ', '');

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

[^0-9]+

【讨论】:

    【解决方案3】:
    $CC_Regex = "^\s*(\d{4}-){3}\d{4}\s*$|^\s*(\d{4} ){3}\d{4}\s*$|^\s*\d{16}\s*$"
    

    即使存在前导或尾随空白符,也会使其匹配(\s 表示任何空白字符)。

    【讨论】:

    • 感谢您提供的信息。我刚刚对此进行了测试,它似乎捕捉到了匹配字符串末尾有一个空格的情况。它似乎没有捕捉到匹配字符串之前有空格或匹配字符串前后都有空格的情况。
    • @John,我已经更正了正则表达式。感谢您指出错误,并很抱歉首先提供了错误的答案。
    【解决方案4】:
    $CC_Regex = "(?:\d{4}[- ]?){3}\d{4}"
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2021-09-13
        • 2020-08-06
        • 2018-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-16
        相关资源
        最近更新 更多