본문 바로가기

WEB_Programming/Pure Java

Regular Expression > String Literals

API를 이용하여 매칭되는 패턴의 가장 기본적인 형태는 스트링 리터럴의 매칭작업이다. 예를 들어 정규식 표현으로 foo를 입력하고 입력 문자로 foo를 입력한경우 이 매치작업은 문자 비교로 성공적으로 수행된다. 이것을 test harness에 입력해보자.
Enter your regex: foo

Enter input string to search: foo

I found the text "foo" starting at index 0 and ending at index 3.

이 매치는 성공한다. 입력 문자가 3의 길이를 가지는 문자이므로 시작 인덱스 0에서 종료 인덱스 3에 매칭이 된다. 일반적으로 범위는 시작은 포함하고, 끝 인덱스는 제외하는것이 보통이다. 다음 그림과 같이 말이다.

The string literal

The string literal "foo", with numbered cells and index values.

각 문자는 cell을 차지하고, 그속에 들어있다. 인덱스 위치는 각 셀의 사이에 들어가게 된다. 문자열 "foo"는 시작 인덱스가 0이고, 종료 인덱스는 3이다. 인덱스가 가질 수 있는 값은 0, 1, 2 이지만 말이다.

다음 매치를 보자. 다음 매칭되는 시작 인덱스와 이전 매치의 종료 인덱스가 서로 겹치는것을 확인해 볼 수 있다.

Enter your regex: foo

Enter input string to search: foofoofoo

I found the text "foo" starting at index 0 and ending at index 3.

I found the text "foo" starting at index 3 and ending at index 6.

I found the text "foo" starting at index 6 and ending at index 9.

메타 문자

패턴 매치를 위해서 API에서는 특수 문자를 몇가지 지원한다. 정규식을 cat.로 바꾸고, 입력 문자를 cats.로 넣으면, 다음 결과가 나올 것이다.
Enter your regex: cat.

Enter input string to search: cats

I found the text "cats" starting at index 0 and ending at index 4.
매치는 여전히 성공할 것이다. "."이 입력 문자에 나타나지 않더라도 말이다. 이것이 성공한 이유는 dot라는 것이 메타 문자이기 때문이다. matcher에 의해서 해석된 특별하 의미가 메타문자이다.  메타문자 "."의 의미는 어떠한 문자든 이라는 뜻이다. 이번 예제에서는 어떤 문자든 허용하기 때문이 이 값이 성공하게 된다.

API에 제공되는 메타문자는 ([{\^-$|]})?*+. 을 지원하고 있다.


Note: 특정 상황에서 특수 문자(상위에 리스트된 문자)가 메타문자로 다루어지지 않고 일반 문자로 다루어 져야할때가 있다. 이렇게 수행하기 우해서는 regular expression을 어떻게 생성하는냐에 달려 있다. 생성자에 의해서 메타문자로 사용할지 일반 문자로 사용할지 결정할 수 있으며, 예를 들어 ! @ and # 문자는 절대로 특별한 의미를 가지지 않는다.

메타 문자를 일반 문자로 다루고자 할경우 2가지 방법이 있다.
  • 첫번째 메타 문자에 백슬레시를 넣는 방법
  • \Q (which starts the quote) and \E (which ends it)로 메타 문자를 감싸주는 방법
이러한 기술을 이용할때 \Q and \E 은 표현식의 어떠한 위치에서든지 위치할 수 있다.