2

私はかなり特定の方法で文字列を分割しようとしています。.split()とメソッドを使って騙されてきましたが.replaceall()、正しく理解できません。

分割する必要のある文字列の例をいくつか示し、分割後の文字列の状態を示します。は、配列内の,新しい文字列を示します。

例1:"(and (or (can-hit-robot) (wall) ) (can-hit-robot) (wall) ) )"

"(and", "(or", "(can-hit-robot)", "(wall)", ")", "(can-hit-robot)", "(wall)", ")"

例2:"(seq (shoot) (if (can-hit-robot) (shoot) (move) ) )"

"(seq", "(shoot)", "(if", "(can-hit-robot)", "(shoot)", "(move)", ")", ")"

例3: "(while(wall)(if (can-hit-robot)(shoot)(move)))"

"(while", "(wall)", "(if", "(can-hit-robot)", "(shoot)", "(move)", ")", ")"

どんな助けでも大歓迎です!

4

4 に答える 4

1

どうですか?

(?:\s*(?=\())|(?:(?<=\))\s*)

ただし、後読みに依存しているため、後読みのないエンジンはこの式を処理できない場合があります。:(

表現されているルールは、開き括弧の直前と閉じ括弧の直後に分割し、括弧の外側のスペースも切り捨てることです。したがって、交代の左側の部分は、開き括弧に至るまでのスペースと一致します。右側の部分は、閉じ括弧の後に続くスペースに一致します。

于 2012-05-12T10:40:15.243 に答える
1

後読みアサーションなし: で分割できます

\s*(?=\(|\B\))

これは開き括弧または閉じ括弧 (空白を含む) の前で分割されますが、閉じ括弧の前に単語境界がない場合に限ります。

入力:(and (or (can-hit-robot) (wall) ) (can-hit-robot) (wall) ) )

出力:

(and 
(or 
(can-hit-robot) 
(wall) 
) 
(can-hit-robot) 
(wall) 
) 
)

入力:(while(wall)(if (can-hit-robot)(shoot)(move)))

出力:

(while
(wall)
(if 
(can-hit-robot)
(shoot)
(move)
)
)
于 2012-05-12T10:46:05.353 に答える
0

そこには明らかに文法があります。正規表現で解析するのではなく、実際のパーサーを使用してください。

推奨事項:

あるいは、最初に解析について読むことから始めた方がよいかもしれません。

そうでなければ、クトゥルフが呼んでいる

于 2012-05-12T10:46:18.617 に答える
0

あなたが求めているものではありませんが、適切なパーサーを書いた方が良いと思います。この式をどうにかして評価したいと思いますか?次に、入力を解析してツリーにすることができます。これにより、評価がはるかに簡単になります。

最初の例 を例に取ると(and (or (can-hit-robot) (wall) ) (can-hit-robot) (wall) ) )、再帰的降下パーサーは を読み取り、and新しい部分式 ( ) を見つけ、( )(or (can-hit-robot) (wall) ) (can-hit-robot) (wall) )の新しい子を開始する、などを行います。and(or (can-hit-robot) (wall) )

于 2012-05-12T10:47:09.463 に答える