【问题标题】:Case Insensitive Regex Matching Using "Matches"使用“匹配”的不区分大小写的正则表达式匹配
【发布时间】:2018-12-12 22:37:47
【问题描述】:

我似乎无法在这里找到我正在尝试做的事情的示例。

我有一个正则表达式列表,我正在搜索 csv 文件的每一行,如果所有内容都是大写的,它们就可以很好地工作。但是,我的搜索是区分大小写的,我不知道如何使它不区分大小写,而不用 ?i 之类的东西修改每个正则表达式。是否可以通过简单的方式修改我在这里所做的事情?

奖励积分!我正在使用数千个正则表达式进行搜索,这似乎需要很长时间。如果您碰巧知道一种更快的方法来搜索所有正则表达式的每一行,请分享。

    $file = New-Object System.IO.StreamReader ($CSVFile)  # Input Stream
        while (($text = $file.ReadLine()) -ne $null ){
            foreach ($RX in $SearchList){
                foreach ($match in ([regex]$RX).Matches($text)) {
                        write-host "Match found: " $match.value -ForegroundColor Red     
                }
            }
        }
    $file.close();

感谢您对此的任何帮助!

【问题讨论】:

  • 正如 jrider 指出的,如果你使用 [regex] 类型,那么你默认区分大小写。您将需要使用所需的选项来更改它。 ///// 如果使用内置的-match,默认情况下不区分大小写。 ///// 如果您有数千个正则表达式模式,为什么要一次一个地尝试它们?使用 | 获得 OR,您可以将整个列表作为一个测试提供。
  • 请注意,您可以在正则表达式中将正则表达式选项内联指定为 (?i) 以不区分大小写。

标签: regex powershell


【解决方案1】:

foreach ($RX in $SearchList){ 中添加这一行:

$RX = [regex]::new($RX,([regex]$RX).Options -bor [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)

这确保 $RX 是一个 [regex] 对象,并将 IgnoreCase 选项添加到任何存在的选项。

【讨论】:

    【解决方案2】:

    为了加快速度,您可以在搜索之前做两件事:将整个文件读入内存并创建所有正则表达式对象...

    $reList = $SearchList | ForEach-Object { [regex]$_ } # adapt the regex here
    
    $lines = [System.IO.File]::ReadAllLines($CSVFile)
    

    您真的需要数千个正则表达式吗?

    新语法变为:

    foreach($line in $lines) {
        foreach($re in $reList) {
    
        }
    }
    

    【讨论】:

    • 这似乎是个好主意。但是,我不确定如何实现实际的搜索部分。我试过 $reList | Where-Object {$_ -match $lines} 我也尝试了一个 foreach,但我似乎没有得到任何匹配。
    • 它看起来像这样工作: foreach ($match in ($reList).Matches($lines)) {} 但是,我还需要捕获它所在的行。我为此创建了一个新问题。 stackoverflow.com/questions/53764919/…
    • 另外,我似乎无法访问 $reList 中的值。试过 $reList[0].options.value__ 但它返回 0
    • 语法和你原来的一样。我已经更新了帖子。
    • 好的,这真的很有帮助,谢谢!我对此进行了测试,relist 使它更快。但是,$lines 行似乎对速度没有太大影响。我用你给我的 reList 两种方式都试过了。谢谢! PS查看我的另一个问题,如果您发布此问题,我可以为您提供答案。 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多