2017-11-17 142 views
1

因此,在Java中编写Brainfuck翻译程序的过程中,我需要按照下列规则拆分字符串:任何[ ] , .字符或任何+ - < >的序列后面都应该换行符。这里的输入字符串:正则表达式并不总是使用尖括号

..-<[-]>..[[<<[+[-<-->>+,>-.++]-,>,<[.],][<.,<-]+[-,<->,-]<<[>->-.<-[.<++,>++,].-]]] 

而且我的代码:

s = s.replaceAll("(\\+|-|<|>)+", "$0\n") 
.replaceAll("\\.|\\,|\\[|\\]", "$0\n"); 

而结果(SO不会让这种这里):https://pastebin.com/ZaT8d5ve 什么预期:https://pastebin.com/gNxcgTSP 似乎支架的连接带有正负号的错误,而带方括号和点/逗号的尖括号可以。我真的不明白,我的解决方案有什么问题?

回答

3

你的输出做了你描述的到底是什么,的+-<>序列之后\n所以-<成为-<\n-\n<\n

如果我理解正确,你要分割的相同的字符要么是+-<>后有\n序列。如果是这样的话,那么代替

s.replaceAll("(\\+|-|<|>)+", "$0\n") 

可以使用

s.replaceAll("(\\+|-|<|>)\\1*", "$0\n") 

\1是反向引用从组1(这里(\\+|-|<|>))相匹配,所以它相匹配的角色之一,其可选择以下重复。

2

你似乎认为

(\\+|-|<|>)+ 

将匹配像++相同的字符序列只,而这也是这些字符,如-<-->>的任何序列匹配。

你也不需要依次使用两个正则表达式。以下应该做的:

s = s.replaceAll("([+<>-])\\1*|[,.\\[\\]]", "$0\n");