因此,在使用Java编写Brainfuck转换器的过程中,我需要按照下一条规则拆分字符串:任何[ ] , .
个字符或+ - < >
的任何序列都应该跟换行。这是输入字符串:
..-<[-]>..[[<<[+[-<-->>+,>-.++]-,>,<[.],][<.,<-]+[-,<->,-]<<[>->-.<-[.<++,>++,].-]]]
我的代码:
s = s.replaceAll("(\\+|-|<|>)+", "$0\n")
.replaceAll("\\.|\\,|\\[|\\]", "$0\n");
结果(SO在这里不允许这样做):https://pastebin.com/ZaT8d5ve 预期结果:https://pastebin.com/gNxcgTSP 似乎括号与正号和负号的连接是错误的,而带方括号和点/逗号的尖括号是好的。我无法解决,我的解决方案有什么问题?
答案 0 :(得分:3)
您的输出正是您所描述的,+
-
<
>
的序列后跟\n
,因此-<
变为{ {1}}不是-<\n
。
如果我理解正确你想要分割相同字符的顺序,-\n<\n
+
-
<
要{ {1}}之后。如果是这种情况则代替
>
你可以使用
\n
s.replaceAll("(\\+|-|<|>)+", "$0\n")
是对来自第1组(此处为s.replaceAll("(\\+|-|<|>)\\1*", "$0\n")
)的匹配的反向引用,因此它会匹配其中一个字符及其可选的后续重复。
答案 1 :(得分:2)
你似乎认为
(\\+|-|<|>)+
只会匹配相同字符的序列,例如++
,但它也匹配-<-->>
这些字符的任何序列。
您也不需要依次使用两个正则表达式。以下应该做:
s = s.replaceAll("([+<>-])\\1*|[,.\\[\\]]", "$0\n");