▸JAVA/기본 문법

정규표현식 (메타문자와 주의사항) [1/2]

코데방 2019. 12. 10.
728x90

[ 정규표현식(Regular Expression - regex) ]

  • 문자열을 찾기 위한 조건을 문자열로 표현한 것
  • 특정 패턴의 문자열을 찾거나, 문자열이 패턴에 맞는지 검사할 때 사용
  • 패턴 검사는 java.util.regex 패키지의 클래스들을 이용함
  • 메소드 매개변수에 "regex"라고 써져 있는 것은 정규표현식을 매개변수로 받는다는 의미

정규표현식은 특정 패턴을 가진 문자열을 추출하거나, 이메일 주소를 입력할 때와 같이 특정 패턴에 맞게 문자열이 작성됐는지 검사할 때 사용됩니다. 아래는 정규표현식으로 문자열을 검색하는 결과를 시각화해서 보여주는 사이트 링크입니다. 검색식을 테스트해볼 때 유용합니다.

 

https://regex101.com/

 


 

[ 정규표현식의 메타 문자 ]

  • 특정 문자의 패턴을 표현하기 위한 규칙

 

※ 역슬레시 (\) 사용법
1. 위치마다 인식하는 문자의 범위가 조금 다르긴 하지만 편하게 공통적으로 생각하는 것이 좋음

2. 메타문자에 사용되는 문자를 제외한 모든 문자는 그냥 검사해야할 문자로 인식
   - [A!@#] 은 'A', '!', '@', '#' 을 허용
   - (A!@#) 은 "A!@#"을 허용

3. \가 붙어있는 메타문자를 사용할 때는 앞에 \를 하나 더 붙여줘야 함
   - (\\s) : 공백 하나만 허용 
   - 하나만 붙이면 이스케이프 문자(escape charactor)로 인식
   - [\t]로 사용하면 "\t(탭)"을 true로 인식 (필요하면 사용 가능)

4. 특수문자 앞에 \\를 붙이면 특수문자 자체를 검사할 문자로 인식
   - [\\!] : '!' 하나만 허용 ('!'는 메타문자가 아니므로 [!]로 써도 상관없음)

5. 메타문자를 제외한 일반 문자 앞에는 \\를 안쓰는게 좋음
   - [\\f] : 에러는 안나지만 검색이 안됨

6. 역슬레시 자체를 정규표현식의 검사할 문자로 인식시키려면 "\\\\"로 써주면 됨
   - [\\\\] : '\' 하나만 허용
   - 검사할 문자열에서 \를 표현하고 싶으면 \\ 두번을 써주면 됨
   - "\\" : '\' 문자 하나를 의미

 

예제 및 작성법은 다음글을 참조하시면 됩니다. 인터넷에서 보다가 사람들이 인지 못하고 넘어가는 부분이 있어서 주의사항으로 남깁니다.

 


 

※ 정규표현식 사용 시 주의사항 ※

인터넷에 설명글들을 보면 가끔 이런 표현식들이 보입니다. 하지만 해당 표현식은 잘못 됐습니다. 중간에 마침표(.)가 문자가 아닌 메타문자로 인식되어 "file.txt"도 true지만 "filetxt"도 true가 됩니다. 메타문자 마침표는 역슬레시(\)가 아닌 모든 문자이기 때문에 마침표가 없어도 true가 되는 것이죠. 메타문자와 일반문자를 잘 못 사용하면 의도했던 검색식이 되지 않을 수 있습니다.

"\\S+.(?i)(txt|pdf|hwp|xls)"  
// 의도 : "파일명.확장자" 형식 검사
// 동작 : "아무글자확장자" 형식 검사

 

위의 식의 올바른 표현은 아래와 같습니다. 마침표를 일반 문자로 인식하도록 합니다. [ ] 안으로 들어가면 일반문자로 인식됩니다.

"\\S+\\.(?i)(txt|pdf|hwp|xls)" 또는 "\\S+[.](?i)(txt|pdf|hwp|xls)"

 


 

또한 이런 경우가 있을 수도 있습니다. 괄호( ) 표시는 [ ]와 다르게 안에 들어있는 것 전체를 하나로 본다는 의미입니다. 문자만 넣어둘 경우 한 단어로 인식하는 것이죠. (ABC)는 "ABC" 하나를 허용하겠다는 의미입니다. 여기서도 메타문자를 잘 못 사용할 수 있습니다.

		String a = "(C+)";	// true		
		String b = "CCCC";	// true
		String c = "C+";	// false

 

 

위의 예시와 같이 "C+"이라는 문자를 허용하려고 괄호로 감쌌는데 "CCCC"가 true가 됩니다. 정작 "C+" false가 되죠. 괄호 안에서 메타문자 +가 작동하기 때문입니다. 괄호 대신 [C+]로 사용하면 'C'나 '+'를 허용한다는 의미가 됩니다. 괄호의 종류에 따라 특수문자가 메타문자가 되기도 하고 일반문자로 인식되기도 합니다. 위와 같은 경우도 아래와 같이 작성해줘야 합니다.

		String a = "(C\\+)";  // true		
		String b = "CCCC";    // false
		String c = "C+";      // true

 


 

여기서 알 수 있는 점은 메타문자와 일반문자를 구분하는 것이 가장 중요하다는 점입니다. 잘 못 썼는데 에러가 나지 않으면 첫 파일명 검사 예시와 같이 잘 작동하는줄 알고 넘어갈 수도 있습니다. 따라서 실제 사용 시에는 특수문자에 \\를 붙여서 일반문자임을 명시해주는 것이 좋습니다.

다음 글에서는 실제 사용 방법에 대해 정리해보겠습니다.

728x90

댓글

💲 추천 글