首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量列表中的元引用模式

变量列表中的元引用模式
EN

Stack Overflow用户
提问于 2012-04-09 05:35:48
回答 1查看 81关注 0票数 1

我有一个要在字符串中查找的模式列表。这些模式数不胜数,包含许多元字符,我只想从字面上匹配它们。所以这是使用\Q..\E进行元引用的完美应用程序。复杂的是,我需要将模式的变量列表连接到一个正则表达式中。

代码语言:javascript
复制
use strict;
use warnings;
# sample string to represent my problem
    my $string = "{{a|!}} Abra\n{{b|!!}} {{b}} Hocus {{s|?}} Kedabra\n{{b|+?}} {{b|??}} Pocus\n {{s|?}}Alakazam\n";

# sample patterns to look for    
my @patterns = qw({{a|!}} {{s|?}} {{s|+?}} {{b|?}});
# since these patterns can be anything, I join the resulting array into a variable-length regex
my $regex = join("|",@patterns);

my @matched = $string =~ /$regex(\s\w+\s)/; # Error in matching regex due to unquoted metacharacters
print join("", @matched); # intended result: Hocus\n Pocus\n

当我尝试在连接操作中引入元引用时,它们似乎没有任何效果。

代码语言:javascript
复制
# quote all patterns so that they match literally, but make sure the alternating metacharacter works as intended
my $qmregex = "\Q".join("\E|\Q", @patterns)."\E";

my @matched = $string =~ /$qmregex(\s\w+\s)/; # The same error

由于某些原因,当元引用包含在我用作正则表达式的字符串中时,它没有任何作用。对我来说,只有像在/\Q$anexpression\E/中那样直接添加到正则表达式中时,它们才能工作,但据我所知,这不是我的选择。我该如何解决这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2012-04-09 06:33:56

我不理解您所期望的结果,因为AbraKedabra是所有模式前面唯一的字符串。

要解决您的问题,您必须单独转义正则表达式的每个组件,因为\Q\E只影响出现它们的字符串的值,所以"\Q""\E"只是空字符串"",而"\E|\Q"只是"|"。你可以写

代码语言:javascript
复制
my $qmregex = join '|', map "\Q$_\E", @patterns;

但是调用quotemeta函数会更简单。

您还必须将列表用圆括号(?:...)括起来以隔离替换,并将/g修饰符应用于正则表达式匹配以查找字符串中的所有匹配项。

试一试

代码语言:javascript
复制
use strict;
use warnings;

my $string = "{{a|!}} Abra\n{{b|!!}} {{b}} Hocus {{s|?}} Kedabra\n{{b|+?}} {{b|??}} Pocus\n {{s|?}}Alakazam\n";

my @patterns = qw(  {{a|!}} {{s|?}} {{s|+?}} {{b|?}}  );

my $regex = join '|', map quotemeta, @patterns;
my @matched = $string =~ /(?:$regex)(\s\w+\s)/g;
print @matched;

输出

代码语言:javascript
复制
 Abra
 Kedabra
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10066746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档