使用交替或字符类进行单个字符匹配?

     2023-03-24     135

关键词:

【中文标题】使用交替或字符类进行单个字符匹配?【英文标题】:Using alternation or character class for single character matching? 【发布时间】:2011-06-11 02:36:47 【问题描述】:

(注意:标题似乎不清楚——如果有人能改写一下,我完全赞成!)

给定这个正则表达式:(.*_e\.txt),它匹配一些文件名,除了e,我还需要添加一些其他单字符后缀。我应该选择一个角色类别还是应该为此使用替代品? (或者真的很重要??)

也就是说,以下两个中哪一个看起来“更好”,以及为什么:

a) (.*(e|f|x)\.txt),或

b)(.*[efx]\.txt)

【问题讨论】:

您将很难衡量两者之间的任何性能差异。不用担心,只用最清晰的。 @bobbogo:请注意,这个问题并不是关于性能,而是关于“更好”+为什么。 @Mrtin:我完全同意。清除代码是这里的首要任务。 【参考方案1】:

使用[efx] - 这正是字符类的设计目的:匹配包含的字符之一。因此它也是最易读和最短的解决方案。

我不知道它是否更快,但如果不是,我会非常惊讶。绝对不会慢。

我的推理(从未编写过正则表达式引擎,所以这是纯粹的猜想):

正则表达式标记[abc] 将在正则表达式引擎的一个步骤中应用:“下一个字符是ab 还是c?”

(a|b|c) 但是告诉正则表达式引擎

如果需要,记住字符串中的当前位置以便回溯 检查是否可以匹配a。如果是这样,那就成功了。如果没有: 检查是否可以匹配b。如果是这样,那就成功了。如果没有: 检查是否可以匹配c。如果是这样,那就成功了。如果没有: 放弃。

【讨论】:

【参考方案2】:

这是一个基准:

根据tchrist的评论更新,差别更显着

#!/usr/bin/perl
use strict;
use warnings;
use 5.10.1;
use Benchmark qw(:all);

my @l;
foreach(qw/b c d f g h j k l m n ñ p q r s t v w x z B C D F G H J K L M N ñ P Q R S T V W X Z/) 
    push @l, "abc$_.txt";


my $re1 = qr/^(.*(b|c|d|f|g|h|j|k|l|m|n|ñ|p|q|r|s|t|v|w|x|z)\.txt)$/;
my $re2 = qr/^(.*[bcdfghjklmnñpqrstvwxz]\.txt)$/;
my $cpt;

my $count = -3;
my $r = cmpthese($count, 
    'alternation' => sub 
        for(@l) 
            $cpt++ if $_ =~ $re1;
        
    ,
    'class' => sub 
        for(@l) 
            $cpt++ if $_ =~ $re2;
        
    
);

结果:

              Rate alternation       class
alternation 2855/s          --        -50%
class       5677/s         99%          --

【讨论】:

这是一个有趣且我认为很有用的插图。虽然有很多东西没有涉及。如果您改变输入数据,您将获得不同的性能,如果您改变模式,您也会获得不同的性能。例如,[bcdfghjklmnñpqrstvwxz](b|c|d|f|g|h|j|k|l|m|n|ñ|p|q|r|s|t|v|w|x|z) 的西班牙辅音要长得多,大概应该表现出不同的表现特征。 我认为你应该使用use utf8; pragma 因为你的$re1$re2 不匹配;-)【参考方案3】:

对于单个字符,它的差异很小,这无关紧要。 (除非你正在做很多操作)

但是,为了可读性(以及稍微提高性能),您应该使用字符类方法。

更多信息 - 打开圆括号( 会导致 Perl 开始回溯该当前位置,由于您没有更多匹配项,因此您真的不需要您的正则表达式。字符类不会这样做。

【讨论】:

您可以使用独立的子组(?>…) 对组中的回溯进行一些控制。这样,一旦确定了某种可能性,就不会重新访问该组本身。不过使用起来有点棘手。 @tchrist:更简单的是每次你不想捕获子组时只使用简单的(?:...)

正则表达式

...术Aregularexpression是计算机科学中的一个概念。正则表达式使用单个字符串来描述匹配一系列符合某个句法规则的字符串。g全文搜索,i忽略大小写,m多行搜索具有特殊意义的专用字符,用来规定其前导字符([\\^$|)?*+.不同组合中的... 查看详情

python正则表达式--匹配单个字符(代码片段)

...hon中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re,使用方法如下:#导入re模块importre#使用match方法进行匹配操作result=re.match(正则表达式,要匹配的字符串)#如果上一步匹配到数据的话,可以使用group... 查看详情

jpql模糊匹配单个字符

...查出数据库中满足后三位是数字的字符串对于mysql来说,使用通配符%和_可以轻松解决,但是对于JPQL来说模糊查询就伤脑筋了。。。有一个方法,可以使用like查询出来以后,再在java代码里进行过滤。虽然很笨,但也有效 查看详情

正则表达式如何匹配空值?

...符串结尾位置\\s匹配一切空白字符\\n匹配换行正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。扩展资料:构造正则... 查看详情

rewrite跳转场景(代码片段)

...整Rewrite跳转实现Rewrite实用场景Nginx跳转需求的实现方式使用rewrite进行匹配跳转使用if匹配全局变量后跳转使用location匹配再跳转rewrite放在server{},if{},location{}段中对域名或参数字符串使用if全局变量匹配使用proxy_pass反... 查看详情

正则表达式

 正则表达式的概念  正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。正则表达式的... 查看详情

如何用正则表达式匹配括号中的内容,不包含括号

...等这些在正则表达式中有特殊意义的字符,要当普通字符使用时,在其前面加'\\'即可。正则表达式中的圆括号的作用:正则表达式中的圆括号的作用是对字符进行分组,并保存匹配的文本。圆括号用法I:对字符或元字符... 查看详情

正则表达式

...要提取的,可以用来分组.匹配除换行符以外的所有单个字符X*匹配X(单个字符)零次或多次X+匹配X(单个字符)一次或多次.*匹配任意字符任意次(换行符除外)?匹配该字符前面的字符0次或1次d匹配数字匹配单词的开始或结束w匹配数字... 查看详情

通配符

...集中的字符[:class:]匹配任意一个属于指定字符类的字符常使用的字符类字符类描述[:alnum:]匹配任意一个字母或数字[:alpha:]匹配任意一个字母[:digit:]匹配任意一个数字[:lower:]匹配任 查看详情

d21_1.1_正则表达式_单个字符匹配

#### re.findall 找到所有与正则表达式相匹配的字符串语法:lst=re.findall(正则表达式,字符串)#(1)预定义字符集#d匹配数字#D匹配非数字#w匹配字母或数字或下划线(正则函数中,支持中文的匹配)#W匹配非字母或数字或下划线#s匹配任... 查看详情

如何使用正则表达式匹配所有数字字符和一些单个字符

】如何使用正则表达式匹配所有数字字符和一些单个字符【英文标题】:Howtomatchallnumericalcharactersandsomesinglecharactersusingregex【发布时间】:2014-01-2400:33:42【问题描述】:如何使用正则表达式匹配字符串中的所有数字以及特定字符... 查看详情

正则表达式

字符类字符类与一组字符中的任何一个字符匹配。  .  通配符:与除 之外的任何单个字符匹配。 若要匹配原意句点字符(.或u002E),您必须在该字符前面加上转义符(.)。a.e"have"中的"ave","mate"中的"ate"w与任何... 查看详情

在sql数据库中怎样实现模糊查找匹配。

...字符要用单引号,引起来。同时也可以用notlike参考技术A使用like例如,查询带“蚂蚁”的某字段内容记录,则如下写语句:select*fromtablewherefield1like'%蚂蚁%' 参考技术B用like关键字比如select*frompatientwherenamelike'%王%' 参考... 查看详情

python中正则表达式全部语法速查

...符类,如果你匹配固定字符串或单个字符类,并且你没有使用任何re功能,例如IGNORECASE标志,那么正则表达式的全部功能可能不是必需的。字符串有几种方法可以使用固定字符串执行操作,它们通常要快得多,因为实现是一个针... 查看详情

正则表达式

字符类字符类与一组字符中的任何一个字符匹配。下表列出了字符类:字符类描述模式匹配[character_group]匹配character_group中的任何单个字符。默认情况下,匹配区分大小写。[mn]"mat"中的"m","moon"中的"m"和"n"[^character_group]非:与不... 查看详情

第五章:重复匹配

5.1有多少个匹配:  5.5.1匹配一个或多个字符:    想要匹配同一个字符(或字符集合)的多次重复,只要简单的给这个字符(或字符集合)加上一个+字符作为后缀即可。     +:表示匹配一个或多个字符,比如[0-9]... 查看详情

like的模糊匹配

...可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。_:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。[]:表示括号内所列字符中的一个(类似正则表达式)。指... 查看详情

20170502匹配单个字符串

...式,将学习的过程记录如下:一、正则表达式的概念:1.使用单个字符串来描述匹配一系列符合某个句子语法规则的字符串2.是对字符串操作的一种逻辑公式3.应用来处理文本和数据4.表达过程:依次拿出表达式和文本中的字符比... 查看详情