在包含嵌套parantheses的字符串中,如何使用Perl删除所有内部对?

时间:2013-07-24 02:59:08

标签: perl

假设你有一个像这样的字符串

.((((((.(((((((((((((((((((((...((((...)))).((((...))))))))))))))))))))))))))))))).

我想省略部分...((((...)))).((((...)))并仅获得括号的外层。我怎么能在Perl中做到这一点?

通常我在工作中遇到的字符串都是这样的

(((((.(((((((((((((((((((((...((((((.....))))))..........))))))))))))))))))))))))))

在这种情况下,很容易使用index函数来指定最后(和第一个)的位置,但在嵌套的情况下,我尝试使用堆栈来实施,但它没有用。

这是第一个要省略的嵌套循环 (((((((((((((((((((((((((((...的((((...)))) ((((...)))))))))))))))))))))))))))))))。 这是第二个 (((((((((((((((((((((((((((...((((...))))。的((( (...)))))))))))))))))))))))))))))))。 根据这个我必须省略这些括号之间的所有字符 ((((((((((((((((((((((((((的 ...((((...)))) ((((...))))的))))))))))))))))))))))))))。

2 个答案:

答案 0 :(得分:2)

使用substitution,即以下s/<regular expression>//

请记住括号和句号需要转义。

修改

这是替换

中的正则表达式
$var =~s%\.\.\.\(\(\(\(\.\.\.\)\)\)\)\.\(\(\(\(\.\.\.\)\)\)%%;

答案 1 :(得分:1)

您可以使用巧妙的SO用户ikegami的答案中的代码

Parsing string with nested parentheses using Parse::RecDescent

略有修改: 改变这一行

STRING : /\w+/

到这个

STRING : /[\w\.]+/

然后使用您的一些数据调用$ parser-&gt; parse()方法。

您还可以使用以下代码展平$ tree:

print(Dumper(flatten($tree)));


sub flatten {
    map { ref eq 'ARRAY' ? flatten(@$_) : $_ } @_
}

但也许您已经有代码来处理生成的解析树了。