gpt4 book ai didi

regex - 使用 Perl 正则表达式在 C 样式代码块之前和之后捕获文本

转载 作者:行者123 更新时间:2023-12-04 14:39:40 26 4
gpt4 key购买 nike

我正在尝试使用 Perl 正则表达式在 C 样式代码块之前和之后捕获一些文本。到目前为止,这就是我所拥有的:

use strict;
use warnings;

my $text = << "END";
int max(int x, int y)
{
if (x > y)
{
return x;
}
else
{
return y;
}
}
// more stuff to capture
END

# Regex to match a code block
my $code_block = qr/(?&block)
(?(DEFINE)
(?<block>
\{ # Match opening brace
(?: # Start non-capturing group
[^{}]++ # Match non-brace characters without backtracking
| # or
(?&block) # Recursively match the last captured group
)* # Match 0 or more times
\} # Match closing brace
)
)/x;

# $2 ends up undefined after the match
if ($text =~ m/(.+?)$code_block(.+)/s){
print $1;
print $2;
}

我遇到了第二个捕获组在比赛后没有被初始化的问题。有没有办法在 DEFINE 之后继续正则表达式?堵塞?我认为这应该可以正常工作。
$2应该包含代码块下方的注释,但它没有,我找不到一个很好的理由为什么这不起作用。

最佳答案

捕获组按照它们在正则表达式中出现的顺序从左到右编号,而不是按照它们匹配的顺序。这是您的正则表达式的简化 View :

m/
(.+?) # group 1
(?: # the $code_block regex
(?&block)
(?(DEFINE)
(?<block> ... ) # group 2
)
)
(.+) # group 3
/xs

命名组也可以作为编号组访问。

第二组是 block团体。但是,该组仅用作命名子模式,而不用作捕获。因此, $2捕获值是 undef。

因此,代码块之后的文本将存储在捕获 $3 中。 .

有两种方法可以解决这个问题:
  • 对于复杂的正则表达式,仅使用命名捕获。一旦您从正则表达式对象组装正则表达式,或者如果捕获是有条件的,则认为正则表达式很复杂。这里:
    if ($text =~ m/(?<before>.+?)$code_block(?<afterwards>.+)/s){
    print $+{before};
    print $+{afterwards};
    }
  • 将所有定义放在最后,它们不会弄乱您的捕获编号。例如,您的 $code_block正则表达式只会定义一个命名模式,然后您显式调用它。
  • 关于regex - 使用 Perl 正则表达式在 C 样式代码块之前和之后捕获文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46120425/

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