正则表达式是Perl风格。
我需要找到这些模式:< @ U03AEKYL4>
他们都以同样的方式开始:< @ ;他们在@之后都有9个字符(我想抓住这些字符);它们都以> 结尾。
这个正则表达式完成了这项工作:
/\<@(.*?)\>/
。但是我遇到麻烦:
<@U03AEKWTL|agreen>.
这个表达式匹配,但我不想要它。
我无法找到限制为9个字符的方法,或在遇到 | 时停止。
谢谢。
答案 0 :(得分:1)
(?<=<\@)[^|>]{9}(?=>|\|)
试试这个。使用外观为你完成这项工作。参见演示。
https://regex101.com/r/qH1uG3/12
@ikegami指出,不使用外观更快。
Rate lookaround basic
lookaround 69.9/s -- -89%
basic 644/s 821% --
然而,差异很小(14μs对1.6μs),但速度越快也越简单,因此它最好用。
use strict;
use warnings;
use Benchmark qw( cmpthese );
my %tests = (
lookaround => 'my ($match) = $str =~ /(?<=<\@)([^|>]{9})(?=[|>])/',
basic => 'my ($match) = $str =~ /<\@([^|>]{9})[|>]/',
);
$_ = 'use strict; use warnings; for (1..1000) { our $str; ' . $_ . ' }'
for values %tests;
local our $str = ('x' x 100) . '<@U03AEKYL4>' . ('x' x 100);
cmpthese(-3, \%tests);
答案 1 :(得分:1)
怎么样:
#!/usr/bin/perl
use Modern::Perl;
my $re = qr/<\@(\w{9})>/;
while(<DATA>) {
chomp;
say /$re/ ? "OK : $_" : "KO : $_";
}
__DATA__
<@U03AEKYL4>
<@U03AEKWTL|agreen>
<强>输出:强>
OK : <@U03AEKYL4>
KO : <@U03AEKWTL|agreen>
您可以根据需要更改\w{}
中的.{9}
。