假设你有一个像这样的字符串
.((((((.(((((((((((((((((((((...((((...)))).((((...))))))))))))))))))))))))))))))).
我想省略部分...((((...)))).((((...)))
并仅获得括号的外层。我怎么能在Perl中做到这一点?
通常我在工作中遇到的字符串都是这样的
(((((.(((((((((((((((((((((...((((((.....))))))..........))))))))))))))))))))))))))
在这种情况下,很容易使用index
函数来指定最后(
和第一个)
的位置,但在嵌套的情况下,我尝试使用堆栈来实施,但它没有用。
这是第一个要省略的嵌套循环 (((((((((((((((((((((((((((...的((((...)))) ((((...)))))))))))))))))))))))))))))))。 这是第二个 (((((((((((((((((((((((((((...((((...))))。的((( (...)))))))))))))))))))))))))))))))。 根据这个我必须省略这些括号之间的所有字符 ((((((((((((((((((((((((((的( ...((((...)))) ((((...))))的)))))))))))))))))))))))))))。
答案 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(@$_) : $_ } @_
}
但也许您已经有代码来处理生成的解析树了。