본문 바로가기
Java/Java

[java] 자바 문법 에러 Illegal repetition 해결하기 (split 에러)

by 산코디 2023. 1. 15.

오늘은 자바 문법 에러인 'Illegal repetition' 내용에 대해 해결하는 방법을 정리해 보려고 한다. 해당 에러는 정규 표현식에서 발생하는 에러 메시지이며, 이 메시지는 일반적으로 정규 표현식의 구문 오류를 나타낸다. 




'Illegal repetition near index 1 {' 에러 원인의 유형

해당 에러는 주로 정규 표현식에서 발생하는 문제로, 일반적으로 다음과 같은 원인에 의해 발생할 수 있다.


중복 중괄호 사용
중복 중괄호 {}를 하용하여 반복 횟수를 나타내는 경우에 발생할 수 있다. 예를 들어, 'a{2,}{'와 같이 중복된 중괄호가 사용되면 에러가 발생한다.

지원하지 않는 구문
정규 표현식에서 지원하지 않는 구문이 사용되었을 때 발생할 수 있다. {}와 같은 중괄호는 반복 횟수를 지정하는 용도로 사용되므로 다른 용도로 사용되면 에러가 발생할 수 있다.

이스케이프 처리
정규 표현식에서 특수 문자를 사용할 때 이스케이프 처리를 제대로 해주지 않으면 에러가 발생할 수 있다. '{'와 같은 특수 문자를 사용하려면 '\{'와 같이 이스케이프 처리를 해주어야 한다.

패턴 구성 오류
정규 표현식의 패턴이 잘못 구성되었을 때에도 해당 에러가 발생할 수 있다. 패턴이 잘못된 경우에는 정규 표현식을 다시 검토하고 수정해야 한다.


에러 발생 예제 소스 코드

에러 내용

위의 에러에서 보게 되면 마지막에 "{" 에러가 발생을 했다고 알려주고 있다. 

예제 소스 코드

package com.demo.system;

import java.util.Arrays;
import java.util.stream.Collectors;

public class TestMain {

	public static void main(String[] args) {
		
	    splitTest("abcsefg", "{");
	}
	
	public static void splitTest (String originData, String regex) {
		
	    System.out.println("---------------------------------------------");
	    System.out.println("* 원본 데이터 : " + originData);
	    System.out.println("* 정규식 문자 : " + regex);
	    System.out.println("---------------------------------------------");
		
	    String regexData = Arrays.stream(originData.split("")).collect(Collectors.joining(regex));
	   
	    System.out.println("* 원본 + 정규식 데이터 : " + regexData);
	    System.out.println("---------------------------------------------");
	    
	    String [] arr = regexData.split("" + regex);
	
	    int arrLength = arr.length;
	
	    System.out.println("* split size : " + arrLength);
	    System.out.println("---------------------------------------------");
		
	    for (int i = 0; i < arrLength; i++) {
	    	System.out.println(arr[i]);
	    }
	}
}

위의 소스 코드를 보게 되면 splitTest라는 메서드를 별도로 생성해 줬다. 인자값으로는 테스트할 일반 문자열과 오늘의 테스트 정규식 문자인 "{" 값을 받고 있다.


그리고 다음은 받은 두 인자값을 합쳐주는 코드 라인이 있다.

String regexData = Arrays.stream(originData.split("")).collect(Collectors.joining(regex));

위의 코드를 실행하면 "a{b{c{d{e{f{g" 이런 식으로 문자열 중간중간에 "{" 정규식 문자를 넣어주도록 하였다.


실행 결과

실행 결과는 역시 "{" 정규식 문자 기준으로 split을 실행하면 동일한 에러가 발생을 한다.

해결 방법으로는 split을 사용할 땐 정규식 문자 앞에는 "\\"(역슬래쉬)를 붙여줘서 일반 문자로 인식할 수 있도록 해줘야 한다.

소스 코드를 간단하게 수정하고 다시 한번 실행해 보자.

 

String [] arr = regexData.split("\\" + regex);

split을 할 때 "\\"를 붙여줬다.

정상 실행 결과

결과는 정상적으로 잘 나왔다. 프로그래밍에서 특수 기호, 정규식 문자를 사용할 때에는 split 뿐만 아니라 어느 상황에라도 항상 고려를 하고 소스 코드를 작성하는 것이 좋을 것 같다.

 

 

반응형

중괄호 사용 시 주의사항

자바의 정규 표현식에서 중괄호 '{}'를 사용할 때는 다양한 상황에서 에러가 발생할 수 있다. 정규 표현식이기 때문에 일반 문자와 조금 다르게 사용해야 하며, 그에 따른 주의사항을 알아두는 것이 좋다.


이스케이프 처리
중괄호 '{}'를 사용할 때에는 정규 표현식에서 이스케이프 처리를 해주어야 한다. 이를 위해서 중괄호 앞에 백슬래시를 추가해야 한다. 예를 들어, '{'를 사용하려면 '\\{'와 같이 표현해야 한다.

정규 표현식
정규 표현식은 특수 문자가 많아서 사용법을 잘 숙지해야 하며, 특히, 특수 문자를 사용할 때에는 해당 문자의 역할과 이스케이프 처리 여부를 반드시 고려해야 한다.

문자열 분할
split() 메서드를 사용하여 문자열을 분할할 때에는 정규 표현식을 올바르게 작성하는 것이 중요하며, 정규 표현식에 사용되는 특수 문자는 의도하지 않은 결과를 초래할 수 있으므로 주의가 필요하다.

문자열 처리 라이브러리 사용
정규 표현식을 직접 작성하는 대신에 문자열 처리를 위한 라이브러리를 사용하는 것이 좋다. 이를 통해서 정규 표현식에 대한 이해도가 낮아도 안전하게 문자열을 처리할 수 있다.

중괄호 반복 횟수
중괄호 안에서 숫자를 지정하여 해당 패턴이 반복되는 횟수를 지정할 수 있다. 예를 들어, 'a{3}'는 'a'가 세 번 연속으로 반복되는 패턴을 의미한다. 이때, 중괄호 내에는 반복 횟수를 나타내는 숫자가 와야 한다. 그렇지 않으면 'Illegal repetition near index 1 {'와 같은 에러가 발생할 수 있다.

패턴 구성
중괄호는 패턴의 일부로 사용될 때와 반복 횟수를 지정할 때로 구분된다. 패턴의 일부로 사용될 때는 중괄호를 이스케이프 처리하지 않고 사용할 수 있지만, 반복 횟수를 지정할 때에는 중괄호를 이스케이프 처리해야 한다.


이러한 주의사항을 숙지하고 정규 표현식을 사용할 때에는 에러를 방지하고 패턴을 정확히 지정할 수 있어야 한다.


마무리

오늘은 자바의 문법 에러에 대해서 발생 원인과 해결 방법, 주의사항 등을 정리해 봤다. 해결 방법과 주의사항까지 정리하고 확인해 본 결과 에러의 원인은 간단한 이유라는 것을 확인할 수 있었지만, 정규 표현식에 대한 개념이 부족하다면 해결하는 데에 문제가 될 수 있어 보인다. 마지막에 정리한 주의사항을 통해서 이스케이프와 정규 표현식에 대한 내용을 조금 더 깊이 있게 숙지하고 학습하는 것이 중요하다.

자바가 아닌 다른 언어를 배우고 개발하게 되더라도 정규 표현식에 대한 내용은 거의 비슷하기 때문에 자바 공부를 하면서 미리미리 학습을 해두면 추후에 다른 언어를 배우게 되더라도 시간을 많이 아낄 수 있고, 개발에 대한 품질을 많이 향상시킬 수 있다.


에러 원인

"{"는 예약된 정규식 문자로 split()에 바로 넣고 실행하게 되면 'Illegal repetition' 문법 에러 발생

해결 방법

split("\\{")

사용하고자 하는 정규식 문자 앞에 "\\"를 붙여준다.

 

반응형