Perl匹配前方至少含三个单词的点号的实现问题咨询
解决方案
你原有正则未达预期是因为单词与空格的匹配逻辑存在疏漏,这里提供两种更简洁且能达到预期效果的实现方式:
方案1:优化split用的正则表达式
调整后顾断言里的单词匹配逻辑,适配你对单词(允许包含字母、逗号、撇号)的定义:
use v5.35.2; use warnings; use strict; my $str = shift // q{If you have to go. you go. That's no problem.}; # 后顾断言匹配前方至少3个单词的场景 my $regex = qr/(?<=(?:[\w',]+\s){2}(?:[\w',]+)\s?)\./; my @all_parts = split $regex, $str, 2; # 加第三个参数2表示最多拆分2段,避免后续符合要求的点也被拆分 say for @all_parts;
注意这里给split加了第三个参数
2,限制最多拆分出2段,和你预期的输出结果匹配,避免后续符合规则的点号也被拆分。
方案2:直接捕获匹配(更推荐)
无需依赖可变长度后顾断言,逻辑更直观,不容易踩坑:
use v5.35.2; use warnings; use strict; my $str = shift // q{If you have to go. you go. That's no problem.}; if ($str =~ /^((?:\s*[\w',]+){3,}?[^.]*)\.(.*)/) { say $1; say $2; }
两种方案运行后都可以得到你预期的输出:
If you have to go you go. That's no problem
内容的提问来源于stack exchange,提问作者jonah_w
相关产品推荐
相关产品推荐

