正则表达式匹配最后一行

时间:2019-05-08 18:21:06

标签: regex performance regex-lookarounds regex-greedy

我正在配置一个RegEx(因此很难切换到原始代码来满足此要求),以获取最后一行输入,如果我使用/.*$/,则对于某些用户来说它会变得很慢输入,例如js '1'.repeat(1e6)+'\n2'。有没有获得最后一行的快速方法?

此外,如果将RegEx用作匹配配置不是一个好主意,是否有更好的建议?

2 个答案:

答案 0 :(得分:1)

用于查找大输入字符串的最后一行的优化表达式将是引入显式边界的表达式:

(?m)^.*\z

在类似PHP的语言中,它将写为/^.*\z/m/是定界符,m是多行标志)。插入符号^使引擎如果不匹配则不通过.*(邪恶)正则表达式。因此,我们定义了一个众所周知的边界,不仅可以识别所需零件,而且还可以用于引擎及其内置的优化。

此正则表达式的性能取决于输入字符串的行数。因此,输入字符串like yours根本不是问题,但是like this会引起注意。

在两种情况下,它执行速度都很快,并且不会失败。

答案 1 :(得分:0)

让我们尝试一些测试...
字符串目标= 127,000字节,有1,057行

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