正则表达式并不总是使用尖括号
问题描述:
因此,在Java中编写Brainfuck翻译程序的过程中,我需要按照下列规则拆分字符串:任何[ ] , .
字符或任何+ - < >
的序列后面都应该换行符。这里的输入字符串:正则表达式并不总是使用尖括号
..-<[-]>..[[<<[+[-<-->>+,>-.++]-,>,<[.],][<.,<-]+[-,<->,-]<<[>->-.<-[.<++,>++,].-]]]
而且我的代码:
s = s.replaceAll("(\\+|-|<|>)+", "$0\n")
.replaceAll("\\.|\\,|\\[|\\]", "$0\n");
而结果(SO不会让这种这里):https://pastebin.com/ZaT8d5ve 什么预期:https://pastebin.com/gNxcgTSP 似乎支架的连接带有正负号的错误,而带方括号和点/逗号的尖括号可以。我真的不明白,我的解决方案有什么问题?
答
你的输出做了你描述的到底是什么,的+
-
<
>
序列之后\n
所以-<
成为-<\n
不-\n<\n
。
如果我理解正确,你要分割的相同的字符要么是+
-
<
>
后有\n
序列。如果是这样的话,那么代替
s.replaceAll("(\\+|-|<|>)+", "$0\n")
可以使用
s.replaceAll("(\\+|-|<|>)\\1*", "$0\n")
\1
是反向引用从组1(这里(\\+|-|<|>)
)相匹配,所以它相匹配的角色之一,其可选择以下重复。
答
你似乎认为
(\\+|-|<|>)+
将匹配像++
相同的字符序列只,而这也是这些字符,如-<-->>
的任何序列匹配。
你也不需要依次使用两个正则表达式。以下应该做的:
s = s.replaceAll("([+<>-])\\1*|[,.\\[\\]]", "$0\n");