-1

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

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

我想省略这部分...((((...)))).((((...))),只得到括号的外层。我怎样才能在 Perl 中做到这一点?

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

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

index在这种情况下,使用函数来指定 last(和 first的位置很容易实现),但在嵌套的情况下,我尝试使用堆栈来实现,但它不起作用。

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

4

2 回答 2

2

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

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

编辑

这是替换中的正则表达式

$var =~s%\.\.\.\(\(\(\(\.\.\.\)\)\)\)\.\(\(\(\(\.\.\.\)\)\)%%;
于 2013-07-24T03:09:33.673 回答
1

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

使用 Parse::RecDescent 解析带有嵌套括号的字符串

稍作修改:更改此行

STRING : /\w+/

对此

STRING : /[\w\.]+/

然后用你的一些数据调用 $parser->parse() 方法。

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

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


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

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

于 2013-07-24T07:41:31.373 回答