我想使用perl正则表达式删除函数中的外括号,但我不能构造一个不会干扰内括号的正则表达式。这是一个例子:
void init(){
if(true){
//do something
}
}
到
void init()
if(true){
//do something
}
是否有可以执行此操作的正则表达式?
答案 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";