簡體   English   中英

正則表達式與遞歸表達式匹配嵌套大括號?

[英]Regex with recursive expression to match nested braces?

我正在嘗試匹配sp { ...{...}... }這樣的文本,允許花括號嵌套。 這是我到目前為止:

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 } } 任何人都可以看到我的正則表達式有什么問題嗎?

有很多問題。 遞歸位應該是:

(
   (?: \{ (?-1) \}
   |   [^{}]+
   )*
)

全部一起:

my $regex = qr/
   sp\s+
   \{
      (
         (?: \{ (?-1) \}
         |   [^{}]++
         )*
      )
   \}
/x;

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

對於未充分利用的Text::Balanced就是這種情況,這是一種非常方便的核心模塊。 它不依靠pos的分隔序列的開始被人發現/第一設置,所以我通常調用它是這樣的:

#!/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使用該信息來知道從哪里開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM