我正在使用(?<=(?:(?:\w|,|'){1,20} ){2}(?:\w|,|'){1,20} ?)\.
但它沒有按預期作業:
use v5.35.2;
use warnings;
use strict;
my $str = shift // q{If you have to go. you go. That's no problem.};
my $regex = qr/(?<=(?:(?:\w|,|'){1,20} ){2}(?:\w|,|'){1,20} ?)\./;
my @all_parts = split $regex, $str;
say for@all_parts;
它應該列印出來If you have to go并 you go. That's no problem
有沒有更簡單的方法來實作這一目標?
uj5u.com熱心網友回復:
#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;
my $str = shift // q{If you have to go. you go. That's no problem.};
my $regex = qr/(?:\b[\w,'] \s*){3}\K\./;
my @all_parts = split $regex, $str;
say for @all_parts;
像你想要的那樣分裂。使用\K在實際匹配期間之前丟棄所有內容是關鍵位。(可能會對 RE 進行一些調整,以更好地說明您沒有在示例字串中提供的邊緣情況)。
uj5u.com熱心網友回復:
split / [\w'] (?: [\s,] [\w'] ){2} \K \. /x
筆記:
- 通常使用后視更容易、更有效
\K。它還具有比真正的可變長度回溯可以回溯的 255 個字符更遠的優勢。但它的缺點是不能“回頭看”比上一場比賽結束更遠的地方。這在這里不是問題。 - 隨意洗掉空格。如果這樣做,您還可以洗掉
x. 在每個現有之后添加一個應該使它更快一點。- 你顯然認為
a's是一個詞,但前面的答案可以算作兩個。例如,它認為.前面有 三個詞a's b. c。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316281.html
下一篇:在Perl標簽中顯示HTML
