gpt4 book ai didi

regex - 如何使Perl处理模式 “c++”与grep相同?

转载 作者:行者123 更新时间:2023-12-03 07:46:10 24 4
gpt4 key购买 nike

这并不奇怪:

% perl -ne 'print if /c++/' foo
Nested quantifiers in regex; marked by <-- HERE in m/c++ <-- HERE / at -e line 1.

但这有点:
% grep c++ foo
blah c++ blah

我不知道grep在适应 ++时在做什么-但我希望在perl中也是如此。或者,至少是某种优雅的方式来处理这种情况;该模式来自一个用户,该用户可能会看到 grep c++有效,然后对perl的失败感到惊讶。

我不想使用 quotemeta;我的真实代码期望正则表达式模式(来自用户):
while ( my $pattern = shift @pat_list ) {
my $regex = $opts{case} ? qr/$pattern/ : qr/$pattern/i;
my @hits = grep { /$regex/ } @lines;

我认为可以检测到模式有错误,然后恢复为 quotemeta。但是我似乎无法使用 eval捕获错误(因为它被视为语法错误?)。

最佳答案

shell命令grep至少知道三种解释正则表达式的方式:基本RE(默认值),扩展RE(如果使用-Eegrep调用)和Perl兼容RE(如果使用-P调用)。对于使用Perl的RE引擎的人来说,基本RE的行为有很大不同。 grep的文档说明了您的特定用例:

In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose
their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(,
and \).

这意味着对 grep c++ something.txt的调用中没有元字符。

请注意,甚至与Perl兼容的RE(由著名的库 libpcre提供)也与Perl自己的RE引擎实现的不相同。在所有RE实现中,Perl引擎的功能集都很独特。但是libpcre的PCRE(与Perl兼容的RE)至少非常相似并且也被广泛使用,例如在PHP,C++(Boost)中,使用了诸如 grep之类的工具,并且最像许多其他编程语言。

话虽如此:我建议,如果您想同时在Perl和 grep中使用大多数RE,请使用 grep的Perl兼容模式,例如 grep --perl-regexp $yourRE $yourFile.txt。如果允许任意用户输入,还请确保注意shell引用!有 String::ShellQuote

关于regex - 如何使Perl处理模式 “c++”与grep相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13763531/

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