用于限制字符数的正则表达式模式

时间:2015-02-12 13:39:53

标签: regex perl

正则表达式是Perl风格。

我需要找到这些模式:< @ U03AEKYL4>

他们都以同样的方式开始:< @ ;他们在@之后都有9个字符(我想抓住这些字符);它们都以> 结尾。

  

这个正则表达式完成了这项工作:/\<@(.*?)\>/

     

但是我遇到麻烦:<@U03AEKWTL|agreen>.   这个表达式匹配,但我不想要它。

我无法找到限制为9个字符的方法,或在遇到 | 时停止。

谢谢。

2 个答案:

答案 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}