gpt4 book ai didi

regex - 我必须在 Perl 预编译正则表达式中转义哪些字符?

转载 作者:行者123 更新时间:2023-12-03 12:38:41 26 4
gpt4 key购买 nike

我很难确定哪些字符 必须使用 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'oh 输出)。尝试转义其他讨厌的字符也会导致匹配失败。我可以继续尝试不同的组合来逃避什么,但这里有很多变化,我希望有人能提供一些见解。

最佳答案

您必须对 qr//的分隔符进行转义,并且必须对要用作文字的任何正则表达式元字符进行转义。如果您希望它们是文字 *,则需要对它们进行转义,因为 * 是正则表达式量词。

您的问题是您添加的各种正则表达式标志。/m 没有任何作用,因为您不使用字符串开头或结尾的 anchor (^, $)。/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 Best Practices 中告诉人们总是将这些选项放在他们的正则表达式上,但您现在明白他为什么错了。你应该只在你想要它们做什么时添加它们,并且只在你知道它们做什么时才添加它们。 :) 如果您想使用/x,您可以这样做。您必须转义任何文字空白,您需要以某种方式表示行尾,并且您必须转义文字 # 字符。以前可读的东西现在一团糟:

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

my $re = qr{\#\s+ using\s+ defaults\s+ found\s+ in\s+\.config $eol
\* $eol
\* $eol
选项:$eol
$sc\s+ 1\。\s+ opt1 $eol
$sc\s+ 2\。\s+ opt2 $eol
选择\[1-2\?]:\s+
}X;

如果( $output =~ $re ){
打印 "OK!\n";
}
别的 {
打印“哦!\n”;
}

关于regex - 我必须在 Perl 预编译正则表达式中转义哪些字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/291163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com