2017-11-17 2 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"); 
관련 문제