首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用递归表达式匹配嵌套大括号的正则表达式?

使用递归表达式匹配嵌套大括号的正则表达式?
EN

Stack Overflow用户
提问于 2012-10-04 11:38:04
回答 2查看 3.2K关注 0票数 7

我正在尝试匹配sp { ...{...}... }这样的文本,其中大括号允许嵌套。这就是我到目前为止所知道的:

代码语言:javascript
复制
my $regex = qr/
(                   #save $1
    sp\s+           #start Soar production
    (               #save $2
        \{          #opening brace
        [^{}]*      #anything but braces
        \}          #closing brace  
        | (?1)      #or nested braces
    )+              #0 or more
)
/x;

我就是不能让它与下面的文本匹配:sp { { word } }。有人能看到我的正则表达式出了什么问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-04 11:49:28

这里面有很多问题。递归位应为:

代码语言:javascript
复制
(
   (?: \{ (?-1) \}
   |   [^{}]+
   )*
)

总而言之:

代码语言:javascript
复制
my $regex = qr/
   sp\s+
   \{
      (
         (?: \{ (?-1) \}
         |   [^{}]++
         )*
      )
   \}
/x;

print "$1\n" if 'sp { { word } }' =~ /($regex)/;
票数 6
EN

Stack Overflow用户

发布于 2012-10-04 12:28:04

这是未得到充分利用的Text::Balanced的例子,它是一种非常方便的核心模块。它确实依赖于首先找到/设置的分隔序列开始处的pos,所以我通常这样调用它:

代码语言:javascript
复制
#!/usr/bin/env perl

use strict;
use warnings;

use Text::Balanced 'extract_bracketed';

sub get_bracketed {
  my $str = shift;

  # seek to beginning of bracket
  return undef unless $str =~ /(sp\s+)(?={)/gc;

  # store the prefix
  my $prefix = $1;

  # get everything from the start brace to the matching end brace
  my ($bracketed) = extract_bracketed( $str, '{}');

  # no closing brace found
  return undef unless $bracketed;

  # return the whole match
  return $prefix . $bracketed;
}

my $str = 'sp { { word } }';

print get_bracketed $str;

带有gc修饰符的正则表达式告诉字符串记住匹配的结束点在哪里,extract_bracketed使用该信息知道从哪里开始。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12719935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档