Ускорение соответствия регулярных выражений - PullRequest
0 голосов
/ 13 декабря 2018

Я ищу по тысячам регулярных выражений, и, похоже, на это уходит много времени.Если вам случится узнать о более быстром способе поиска в каждой строке всех регулярных выражений, я весь в ушах.

Мне нужно захватить совпадающее значение, всю совпадающую строку и номер строки.

$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();

1 Ответ

0 голосов
/ 13 декабря 2018

Сопоставление чего-либо с тысячами регулярных выражений в цикле всегда будет работать плохо.Объедините ваши отдельные регулярные выражения в одно

$re = $SearchList -join '|'

и используйте его следующим образом:

(Get-Content $CSVFile) -match $re

или вот так (если входной файл слишком велик, чтобы поместиться в память):

Get-Content $CSVFile | Where-Object { $_ -match $re }

Если у вас слишком много отдельных регулярных выражений, чтобы поместиться в одно большое, вам нужно найти способ уменьшить их количество или объединить несколько из них в более мелкие, более общие.Чтобы помочь вам с этим, вам нужно предоставить нам репрезентативную выборку выражений, с которыми вы хотите сопоставить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...