regex - Perl:最快的匹配?
问题描述
我想在不使用 /s 的情况下做到这一点:
(?:.|\n)+
我希望它很快。
它是更大的正则表达式的一部分,这就是我不能使用 /s 的原因。我已经测试过:
perl -pe 's/(?:.|\n)+//' # 30 MBytes/s
perl -pe 's/[^\777]+//' # 124 MBytes/s
它们不如 /s 快:
perl -pe 's/.+//s' # 164 MBytes/s
我能以某种方式获得与 /s 相同的速度吗?
编辑:
perl -pe 's/(?s).+(?-s)//' # 162 MBytes/s
perl -pe 's/[\d\D]+//' # 162 MBytes/s
perl -pe 's/[\s\S]+//' # 161 MBytes/s
这些都是不错的选择。谢谢。
解决方案
您不需要使用任何变通方法。
您可以使用内联修饰符标志(?s)
来启用点以跨行匹配并(?-s)
禁用此效果。
例如:
(?s).*PATTERN(?-s).*
其中第一个.*
匹配任何文本,最后一个.*
只匹配到行尾。
您还可以使用修饰符组:
(?s:.*)PATTERN(?-s:.*)
在扩展模式中查看更多信息。
推荐阅读
- javascript - JavaScript 获取传入参数的函数实例
- mysql - 与子查询相比,为什么左外连接查询给出不同的结果?
- javascript - 在 Showdown 中忽略多个 \n 实例
- python - Python 没有检测到 Heroku 配置
- image - 用于签署 Node/Cloudinary 的签名字符串无效
- java - Hibernate如何使实体类的模式名称可配置
- java - isShowing() 与 isDisplayable()
- arrays - 在屏幕上访问和显示嵌套数组 React Native
- c++ - C++中多线程并发向单个MySQL表插入数据
- dart - 错误:映射 Dart 映射时,“类型‘字符串’不是‘int’类型的子类型”