假设我想从 Twig 模板中拆分元数据
---
some metadata
multiple lines
---
Twig template
More data
我想出了/\A---\R(.+?\R)?---\R(.*)\Z/s
哪个或多或少的问题,但我想知道它是否会在回溯中变得病态。
假设我想从 Twig 模板中拆分元数据
---
some metadata
multiple lines
---
Twig template
More data
我想出了/\A---\R(.+?\R)?---\R(.*)\Z/s
哪个或多或少的问题,但我想知道它是否会在回溯中变得病态。
您的正则表达式似乎运行良好。
如果您“展开”第一个惰性点模式,您可能会使其效率更高一些,例如
/\A---\R(.*(?:\R(?!---\R).*)*\R)?---\R(?s)(.*)\Z/
请参阅正则表达式演示。注意:不需要(?s)
修饰符,模式内有一个内联修饰符。
细节
\A
- 字符串的开始---\R
----
带有换行符的完整行(.*(?:\R(?!---\R).*)*\R)?
- 一个可选的捕获组 1:
.*
- 整条线(?:\R(?!---\R).*)*
- 0次或多次重复
\R(?!---\R)
- 没有后跟---
换行符的换行符.*
- 整条线\R
- 换行序列---\R
----
带有换行符的完整行(?s)
- 一个内联 DOTALL 修饰符,使点正确匹配换行符(.*)
第 2 组:尽可能多的任何 0+ 个字符\Z
- 字符串结束。