2

我正在尝试以一种相当具体的方式拆分字符串。我一直在鬼混使用.split()and.replaceall()方法,但我做错了。

以下是我需要拆分的几个字符串示例,然后是拆分后的字符串。A,表示数组中的新字符串。

示例 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*)

但是它依赖于lookbehind,所以没有lookbehind的引擎可能无法处理这个表达式。:(

所表达的规则是,在左括号之前和右括号之后拆分,同时切断括号外部的任何空格。因此,交替的左侧部分匹配通向开口括号的空格;右侧部分将匹配结束括号后继续的空格。

于 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

你显然在那里有语法。不要用正则表达式解析它,使用真正的解析器。

建议:

或者,也许您应该首先阅读有关Parsing的内容。

否则,邪神在召唤

于 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 回答