正则表达式并不总是使用尖括号

时间:2017-11-17 21:44:46

标签: java regex

因此,在使用Java编写Brainfuck转换器的过程中,我需要按照下一条规则拆分字符串:任何[ ] , .个字符或+ - < >的任何序列都应该跟换行。这是输入字符串:

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

我的代码:

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

结果(SO在这里不允许这样做):https://pastebin.com/ZaT8d5ve 预期结果:https://pastebin.com/gNxcgTSP 似乎括号与正号和负号的连接是错误的,而带方括号和点/逗号的尖括号是好的。我无法解决,我的解决方案有什么问题?

2 个答案:

答案 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");