RegEx для соответствия последней строке - PullRequest
2 голосов
/ 08 мая 2019

Я настраиваю RegEx (так что будет не так просто переключиться на необработанный код для этого требования), чтобы получить последнюю строку ввода, если я использую /.*$/, она становится довольно медленной для некоторых входов,например, js '1'.repeat(1e6)+'\n2'.Есть ли быстрый способ получить последнюю строчку?

Кроме того, если не рекомендуется использовать RegEx в качестве соответствующей конфигурации, есть ли лучшие предложения?

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Оптимизированным выражением для нахождения последней строки большой входной строки будет такое, которое вводит явные границы:

(?m)^.*\z

В таких языках, как PHP, он будет записан как /^.*\z/m (/ s - это разделители, а m - многострочный флаг). Знак ^ заставляет двигатель не проходить через .* (зло) регулярное выражение, если оно не соответствует. Таким образом, мы определили очень хорошо известную границу не только для того, чтобы распознать нужную деталь, но также для двигателей и их встроенных оптимизаций.

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

В обоих случаях он работает быстро и не выходит из строя.

0 голосов
/ 09 мая 2019

Давайте попробуем несколько тестов ...
Строковая цель = 127 000 байт с 1057 строками

Regex1:   .*$
Options:  < none >
Completed iterations:   5  /  5     ( x 1000 )
Matches found per iteration:   1
Elapsed Time:    12.74 s,   12743.09 ms,   12743087 µs
Matches per sec:   392


Regex2:   .*\z
Options:  < none >
Completed iterations:   5  /  5     ( x 1000 )
Matches found per iteration:   1
Elapsed Time:    12.77 s,   12765.26 ms,   12765260 µs
Matches per sec:   391


Regex3:   \z
Options:  < none >
Completed iterations:   5  /  5     ( x 1000 )
Matches found per iteration:   1
Elapsed Time:    6.41 s,   6410.85 ms,   6410854 µs
Matches per sec:   779


Regex4:   $
Options:  < none >
Completed iterations:   5  /  5     ( x 1000 )
Matches found per iteration:   1
Elapsed Time:    6.36 s,   6364.10 ms,   6364098 µs
Matches per sec:   785
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...