Perl 匹配的文本没有用括号括起来

Perl 匹配的文本没有用括号括起来,perl,parentheses,Perl,Parentheses,我还在学习Perl,如果这是一个明显的问题,我深表歉意。 有没有办法匹配没有用括号括起来的文本? 例如,搜索foo将只匹配第二行 (bar foo bar) bar foo ( bar foo (bar) (foo) ) 正则表达式模式有一个隐式的前导\G(?s:)*?(“在找到匹配项之前跳过字符”)。下面扩展了将嵌套括号看作是要跳过的字符的定义。 while ( $string =~ m{ \G (?&MEGA_DOT)*? ( foo )

我还在学习Perl,如果这是一个明显的问题,我深表歉意。 有没有办法匹配没有用括号括起来的文本? 例如,搜索foo将只匹配第二行

(bar foo bar)
bar foo (
bar foo 
   (bar) (foo)
)

正则表达式模式有一个隐式的前导
\G(?s:)*?
(“在找到匹配项之前跳过字符”)。下面扩展了将嵌套括号看作是要跳过的字符的定义。

while (
   $string =~ m{
      \G (?&MEGA_DOT)*?

      ( foo )

      (?(DEFINE)
         (?<MEGA_DOT> [^()] | \( (?&MEGA_DOT)*+ \) )
      )
   }xg
) {
   say "Found a match at pos $-[1].";
}
while(
$string=~m{
\G(?&MEGA_点)*?
(富)
(?(定义)
(?[^()]|\((?&MEGA\u-DOT)*+\)
)
}xg
) {
说“在pos$-[1]处找到匹配项”;
}
这远远不是“显而易见的”;相反地。对于复杂模式,没有直接的方式来表示“不匹配”(在字符级别有很好的支持,如
[^a]
\S
等)。Regex首先是关于匹配事物,而不是不匹配它们

一种方法是匹配那些(可能是嵌套的)分隔符,并获取除此之外的所有内容

查找嵌套分隔符的一个好工具是核心模块。当它匹配时,它还可以在匹配之前为我们提供子字符串,并在匹配之后为我们提供字符串的其余部分

use warnings;
use strict;
use feature 'say';

use Text::Balanced qw(extract_bracketed);

my $text = <<'END';
(bar foo bar)
bar foo (
bar foo 
   (bar) (foo)
   )
END

my ($match, $before);
my $remainder = $text;
while (1) {
    ($match, $remainder, $before) = extract_bracketed($remainder, '(', '[^(]*');
    print $before // $remainder;
    last if not defined $match; 
}
使用警告;
严格使用;
使用特征“说”;
使用Text::Balanced qw(括号内的摘录);

my$text=您使用的是负面前瞻吗?令人钦佩!但我认为这是人们闻到Perl气味时感到害怕的原因…;-)@PerlDuck,事实上,令人惊讶的是Perl如此简单和结构化。作为一个初学者,我无法理解这一点,因此请提供详细的方法学。我支持@ssr1012请求。我已经在回答中解释了方法学。其余部分在中有文档记录,但它要么是基本正则表达式,要么是明显的(
(&NAME)
)匹配由
(?…)
)定义的模式。我不知道这个模块。谢谢不过,我发现在
$text
$lead
内部匹配时很难找到行号。一种方法是计算
$match
中的换行字符数。“但是有更好的办法吗?”Tohiko欢迎。你的意思是找到源代码中的字符/行吗?在
$lead
中计数
\n
(或
$text
,因为它正在耗尽)不会通知它在源中的行。我会调查的。@Tohiko注意到我把
$lead
改为
$before
,把
$text
改为
$resident
@Tohiko我没有找到比数数更好的方法。它没有得到很好的测试(在这个例子中是有效的),并且可能有各种各样的情况它都不会,但是这里是想法。我添加
$line\u cnt=1
并在
打印后添加行
$line\u cnt+=()=($before=~/\n/g),如果$before。该模块可能提供了一个更好的方法,但我已经有一段时间没有仔细阅读整页了。如果我找到,将更新it@Tohiko另一个功能是
$@->{pos}
,请参阅。但是在这种情况下,由于递归处理,我仍然需要计算行数。