【问题标题】:Regex for searching SSNs in excel files用于在 excel 文件中搜索 SSN 的正则表达式
【发布时间】:2022-01-27 19:21:19
【问题描述】:

我的任务是在整个文件结构中搜索 SSN(以及其他 PII,以便我们可以将其删除),我知道这很有趣。到目前为止,此脚本将搜索给定目录中的所有 .xlsx 文件,但无论我尝试什么,我都无法让 $SearchText 变量工作。我已经尝试了当前显示的正则表达式的许多不同偏差,唯一有效的正则表达式字符串是直问号; "???????????",但这会返回我不想要的整体。

非常感谢任何帮助。

谢谢!

$SourceLocation = "C:\Users\nick\Documents\ScriptingTest"
$SearchText2 = "^(?!(000|666|9))\d{3}-(?!00)\d{2}-(?!0000)\d{4}$"
$SearchText = "*"
$FileNames = Get-ChildItem -Path $SourceLocation -Recurse -Include *.xlsx

Function Search-Excel {
    $Excel = New-Object -ComObject Excel.Application
    $Workbook = $Excel.Workbooks.Open($File)
    ForEach ($Worksheet in @($Workbook.Sheets)) {
        $Found = $WorkSheet.Cells.Find($SearchText)
        If ($Found.Text -match "SearchText2") {
            $BeginAddress = $Found.Address(0,0,1,1)
            [pscustomobject]@{
                WorkSheet = $Worksheet.Name
                Column = $Found.Column
                Row =$Found.Row
                Text = $Found.Text
                Address = $File
            }
            Do {
                $Found = $WorkSheet.Cells.FindNext($Found)
                $Address = $Found.Address(0,0,1,1)
                If ($Address -eq $BeginAddress) {
                    BREAK
                }
                [pscustomobject]@{
                    WorkSheet = $Worksheet.Name
                    Column = $Found.Column
                    Row =$Found.Row
                    Text = $Found.Text
                    Address = $File
                }                 
            } Until ($False)
        }
        }
    }
    $workbook.close($false)
    [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$excel)
    [gc]::Collect()
    [gc]::WaitForPendingFinalizers()
    Remove-Variable excel -ErrorAction SilentlyContinue

foreach ($File in $FileNames) 
{
    Search-Excel
}

编辑:原来 excel 可接受的正则表达式范围非常有限:Acceptable Excel Regex, 所以我将第一个 $Searchtext viarable 修改为“*”,并将第一个 if 语句修改为匹配 excel 搜索之外的正则表达式。现在我只需要想出一个巧妙的正则表达式模式来过滤我想要的东西。下一个问题是过滤:

  1. 没有字母。
  2. 带破折号的有效 SSN。
  3. 不带破折号的有效 SSN。 (这部分让我很困惑,如何搜索可以有破折号的东西,但如果没有,它只能是 9 个字符长)

【问题讨论】:

  • 刮取/耕种社会安全号码? \d\d\d-\d\d-\d\d\d\d
  • 这也不起作用:(
  • 适用于我的 SSN。我从未见过没有破折号的 SSN
  • 如果搜索文本 "???????????" 有效,则 Excel 不得使用传统正则表达式,因为这将无效或匹配零个字符。这看起来更像是通配符语法。你能找到任何关于 Excel 如何解释你传递给Find 的字符串的文档吗?我找到了this documentation for Range.Find,但我不确定是不是同一个方法,而且那个页面没有描述What参数是如何解释的。
  • 至少???-??-???? 应该可以使用通配符。仅供参考forum.aspose.com/t/cells-find-doesnt-work-with-regex/71225

标签: regex powershell


【解决方案1】:

它绝对不是正则表达式,但这确实适用于破折号。我在您的代码中看到的问题是

  1. 您在函数外部定义了搜索文本,但不要将其传入
  2. 与文件名相同
  3. 您的工作簿关闭、com 发布、gc 等不在您的功能范围内,因此它不会执行任何操作。 (除了可能有错误?)

这是我要使用您的代码的内容。现在,如果您有其他文本与 3 chars dash 2 chars dash 4 chars 的模式相匹配,您可以在之后使用正则表达式或任何您喜欢的方式轻松过滤掉它们。

$SourceLocation = "C:\Users\nick\Documents\ScriptingTest"
$SearchText = "???-??-????"
$FileNames = Get-ChildItem -Path $SourceLocation -Recurse -Include *.xlsx

Function Search-Excel {
    [cmdletbinding()]
    Param($File,$SearchText)

    $Excel = New-Object -ComObject Excel.Application
    $Workbook = $Excel.Workbooks.Open($File)

    ForEach ($Worksheet in @($Workbook.Sheets)) {
        $Found = $WorkSheet.Cells.Find($SearchText)
        If ($Found) {
            $BeginAddress = $Found.Address(0,0,1,1)
            [pscustomobject]@{
                WorkSheet = $Worksheet.Name
                Column = $Found.Column
                Row =$Found.Row
                Text = $Found.Text
                Address = $File
            }
            Do {
                $Found = $WorkSheet.Cells.FindNext($Found)
                $Address = $Found.Address(0,0,1,1)
                If ($Address -eq $BeginAddress) {
                    BREAK
                }
                [pscustomobject]@{
                    WorkSheet = $Worksheet.Name
                    Column = $Found.Column
                    Row =$Found.Row
                    Text = $Found.Text
                    Address = $File
                }                 
            } Until ($False)
        }
    }

    $workbook.close($false)
    [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$excel)
    [gc]::Collect()
    [gc]::WaitForPendingFinalizers()
    Remove-Variable excel -ErrorAction SilentlyContinue
}

foreach ($File in $FileNames) 
{
    Write-Host processing $File.fullname
    Search-Excel -File $File.fullname -SearchText $SearchText
}

测试文件的输出

WorkSheet : Sheet1
Column    : 2
Row       : 5
Text      : 123-12-5555
Address   : C:\temp\excel2.xlsx

WorkSheet : Sheet1
Column    : 3
Row       : 21
Text      : 586-99-3844
Address   : C:\temp\excel2.xlsx

WorkSheet : Sheet1
Column    : 7
Row       : 28
Text      : 987-65-4321
Address   : C:\temp\excel2.xlsx

【讨论】:

  • 用我目前发现和想出的内容修改了原帖。
  • 我提出的解决方案有什么问题?
  • 没什么,但我也需要它来搜索不带破折号的 SSN,以防万一
  • 那么,任何通配符模式都可以匹配任何字符串。您可能需要在 SSN 之前/之后查找模式,以便在不使用正则表达式的情况下正确识别它们
猜你喜欢
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多