regex - Perl 中正则表达式的多个可能匹配项
问题描述
我是 Perl 的新手,正在使用正则表达式。当给定的查询字符串可能有多个匹配时,我无法决定 Perl 如何解决正则表达式匹配的歧义。例如
('hellohellohello' =~ m/h.*o/)
这可以匹配 'hello'、'hellohello' 或 'hellohellohello'。它会选择哪一个——最短的还是最大的匹配?如果我们想要相反的行为(比如默认是找到最短匹配然后找到最大匹配)怎么办?
如果第一个的答案是最大的,请考虑
('hello hellohello' =~ m/h.*o/)
在这里,它可以从第一行(换行符之前)或第二行(换行符之后)开始匹配 - 第一个与最大匹配。它会使用哪一个?
可用于确定字符串的哪个子字符串与给定正则表达式匹配的完整规则集是什么(可能是示例中提到的可以找到多个匹配项的情况之外的其他情况)?
解决方案
*
是贪心的,所以它会尝试匹配最长的字符串,只要模式的其余部分仍然可以匹配。所以它会匹配hellohellohello
。
如果您改用*?
它,则它不会贪婪,并且只要其余模式匹配,它将再次匹配最短的字符串。所以m/h.*?o/
会匹配hello
。
推荐阅读
- gradle - 从 gradle 任务中删除现有输入
- python - 试图找到最长的子字符串而不重复字符
- visual-studio-code - 自动右括号在 VS Code 中停止工作
- javascript - Bootstrap Popover 无法在 Mapbox Popup 中打开
- deep-learning - Detectron2 Mask R-CNN 细胞分割 - 什么都看不见
- haskell - 使用数据构造函数作为函数参数
- ruby-on-rails - Rails为rich_text字段形成最大长度?
- if-statement - 在 if else 语句中使用 useState 改变状态的问题
- audio - 如何将 AC3 音频转换为 Wav 音频?
- javascript - 查找共线点的坐标