Perl移除外支架

时间:2016-03-08 20:27:51

标签: regex perl

我想使用perl正则表达式删除函数中的外括号,但我不能构造一个不会干扰内括号的正则表达式。这是一个例子:

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

}

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

是否有可以执行此操作的正则表达式?

2 个答案:

答案 0 :(得分: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处的大括号括起来,告诉Marpa丢弃它们。

答案 1 :(得分:0)

这是:

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