当前位置:  开发笔记 > 编程语言 > 正文

我必须在Perl预编译的正则表达式中逃避哪些字符?

如何解决《我必须在Perl预编译的正则表达式中逃避哪些字符?》经验,为你挑选了2个好方法。

在使用Perl的qr {}构造时,我很难确定必须转义哪些字符

我正在尝试为包含大量正常转义字符(#*.>:[])的文本创建多行预编译正则表达式,并且还包含另一个预编译的正则表达式.另外,我需要尽可能严格地进行匹配以进行测试.

my $output = q{# using defaults found in .config
*
*
Options:
  1. opt1
> 2. opt2
choice[1-2?]: };

my $sc = qr{(>|\s)}smx;
my $re = qr{# using defaults found in .config
*
*
Options:
$sc 1. opt1
$sc 2. opt2
choice[1-2?]: }mx;

if ( $output =~ $re ) {
  print "OK!\n";
}
else {
  print "D'oh!\n";
}

错误:

Quantifier follows nothing in regex; marked by <-- HERE in m/# using defaults found in .config
* <-- HERE 
*
Options:
(?msx-i:(>|\s)) 1. opt1
(?msx-i:(>|\s)) 2. opt2
choice[1-2?]: / at ./so.pl line 14.

试图逃离星号会导致匹配失败(D'输出).试图逃脱其他讨厌的角色也会导致失败的比赛.我可以继续尝试不同的组合来逃避什么,但这里有很多变化,我希望有人可以提供一些见解.



1> brian d foy..:

您必须转义qr //的分隔符,并且必须转义要用作文字的任何正则表达式元字符.如果你想要那些是文字*,你需要逃避它们,因为*是一个正则表达式量词.

这里你的问题是你添加的各种正则表达式标志./ m不执行任何操作,因为您不使用字符串的开头或结尾锚点(^,$)./ s不执行任何操作,因为您不使用通配符.元字符./ x使你的正则表达式中的所有空格变得毫无意义,并将#行转换为正则表达式注释.

这就是你想要的,删除正则表达式标志并转义正确的东西:

my $sc = qr{(>|\s)};

my $re = qr{# using defaults found in \.config
\*
\*
Options:
$sc 1\. opt1
$sc 2\. opt2
choice\[1-2\?]: };

虽然Damian Conway告诉Perl最佳实践的人总是将这些选项放在他们的正则表达式上,但现在你明白为什么他错了.你应该只在你想要它们的时候添加它们,你应该只在你知道它们做什么时添加它们.:)如果你想使用/ x,这是你可能会做的.你必须逃避任何文字空格,你需要以某种方式表示行结尾,你必须逃避文字#字符.之前可读的东西现在变得一团糟:

my $sc  = qr{(>|\s)};
my $eol = qr{[\r\n]+};

my $re  = qr{\# \s+ using \s+ defaults \s+ found \s+ in \s+ \.config $eol
\*                    $eol
\*                    $eol
Options:              $eol
$sc \s+ 1\. \s+ opt1   $eol
$sc \s+ 2\. \s+ opt2   $eol
choice\[1-2\?]: \s+
}x;

if ( $output =~ $re ) {
  print "OK!\n";
}
else {
  print "D'oh!\n";
}



2> geocar..:

听起来你真正想要的是Expect,但你最想要的东西是quotemeta运算符,它逃脱了所有对正则表达式有特殊含义的字符.

要直接回答你的问题(但是),除了非引用字符(在这种情况下}),你需要至少逃避,.[$()|*+?{\

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有