-1

このような文字列があるとします

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

...((((...)))).((((...)))その部分を省略して、括弧の外側のレベルだけを取得したい。Perlでこれを行うにはどうすればよいですか?

仕事で出会う弦はだいたいこんな感じ

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

この場合index、 last(と firstの位置を指定する関数を使用して実装するのは簡単です)が、ネストされたケースでは、スタックを使用して実装しようとしましたが、うまくいきませんでした。

これは、省略される最初のネストされたループです .((((((.((((((((((((((((... ((((...))) )) .((((...))))))))))))))))))))))))))))). これは2番目の .(((((((.(((((((((((((((...((((...))))))) 。 (((...))))))))))) ))))))))))))))))))))。これによれば、これらの括弧 .(((((.(((((((((((((( ( ( ...((((. ..)))).((((...)))) )))))) ) )))))))))))))))))).

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 に答える