2016-03-08 144 views
1

我想使用perl正則表達式去除函數中的外括號,但是我不能構造不干擾內括號的正則表達式。這裏有一個例子:Perl刪除外括號

void init(){ 
    if(true){ 
    //do something 
    } 

} 

void init() 
    if(true){ 
    //do something 
    } 

是有一個正則表達式可以做到這一點?

+0

但是爲什麼?帶括號的版本非常清晰(尤其是對於較長的功能體)。出於好奇,這是什麼語言不需要圍繞函數定義使用大括號? – ThisSuitIsBlackNot

+1

Text :: Balanced'extract_bracketed'但不幸的是,你必須將你的文本填充到多行字符串中。 – stevesliva

+0

也許這是C-to-XS轉換器的一個步驟。 – mob

回答

0

這就是:

my $s = "void init(){ if(true){ //do something }}"; 
$s =~ s/^([^{]+)\{(.*)\}([^{]*)$/$1$2$3/s; 
print "$s\n"; 
2

寫的語言解析器。下面是使用Marpa::R2一個簡單的例子:

#!/usr/bin/perl 
use warnings; 
use strict; 

use Marpa::R2; 

my $input = << '__IN__'; 
void init(){ 
    if(true){ 
    //do something 
    } 

} 
__IN__ 

my $dsl = << '__DSL__'; 

:default ::= action => concat 
lexeme default = latm => 1 

FuncDef ::= type name Arglist ('{') Body ('}') 
Arglist ::= '(' Args ')' 
Args ::= Arg* separator => comma 
Arg  ::= type name 
Body ::= Block+ 
Block ::= nonbrace 
      | '{' nonbrace '}' 


nonbrace ~ [^{}]* 
comma ~ ',' 
type  ~ 'void' 
name  ~ [\w]+ 
space ~ [\s]+ 
:discard ~ space 

__DSL__ 

sub concat { shift; join ' ', @_ } 

my $grammar = 'Marpa::R2::Scanless::G'->new({ source => \$dsl }); 
my $value = $grammar->parse(\$input, { semantics_package => 'main' }); 
print $$value; 

FuncDef的花括號括號,它告訴馬爾巴丟棄它們。