2017-11-17 97 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");