...
텍스트 처리에 있어서 정규식은 스위스 군용 칼과도 같습니다. 정규식을 이용하면 문자열에서 특정 *패턴*을 찾아내고 뽑아낼 수 있습니다. 정규식의 가장 단순한 예는 문자와 숫자로 구성된 문자열입니다. 그리고 정규식을 사용하는 가장 간단한 표현식은 *==~* 연산자를 사용하는 것입니다. So for example to match Dan Quayle's spelling of 'potato':
| Code Block |
|---|
"potatoe" ==\~ /potatoe/
|
groovyConsole에 위 코드를 입력하고 실행하면 true로 평가될 것입니다. 두 가지 주목할 점이 있습니다. 첫째, ==~ 연산자는 ==와 비슷한데 정확한 문자열 일치를 검사하는 것이 아니라 정규식 패턴을 검사합니다. 둘째, 정규식이 / 로 둘러쌓여 있다는 사실입니다. 슬래시 기호는 그 안에 있는 문자열이 보통 String이 아니라 정규식이라는 사실을 알려줍니다.
올바른 철자인 "potato"와도 일치되길 원한다면 'e' 다음에 '?'를 붙여서 'e'가 생략가능하다는 점을 명시할 수 있습니다. 따라서 아래 코드는 여전히 true로 평가됩니다:
| Code Block |
|---|
"potatoe" ==\~ /potatoe?/
|
그리고 올바른 철자 또한 true 입니다:
| Code Block |
|---|
"potato" ==\~ /potatoe?/
|
하지만 그 외의 문자열은 false가 됩니다:
| Code Block |
|---|
"motato" ==\~ /potatoe?/
|
위 예제들이 바로 정규식을 이용하여 Boolean 표현식을 정의하는 방법들입니다. 여기서 조금 더 나아가 보겠습니다. 정규식을 테스트하는 메서드를 정의하겠습니다. Pete Wisniewski의 성을 검사하는 코드입니다:
| Code Block |
|---|
def checkSpelling(spellingAttempt, spellingRegularExpression)
{
if (spellingAttempt ==\~ spellingRegularExpression)
{
println("Congratulations, you spelled it correctly.")
} else {
println("Sorry, try again.")
}
}
theRegularExpression = /Wisniewski/
checkSpelling("Wisniewski", theRegularExpression)
checkSpelling("Wisnewski", theRegularExpression)
|
...
위 예제에서 마지막 정규식은 설명이 필요할 것 같습니다. 꺽쇄괄호의 첫 문자가 *^* 이면 괄호 안에 있는 문자들을 제외한 어떤 문제도 허용된다는 뜻입니다.
연산자
So now that you have a sense for how regular expressions work, here are the operators that you will find helpful, and what they do:
Regular Expression Operators
| a? | matches 0 or 1 occurrence of *a* | 'a' or empty string |
| a
* | matches 0 or more occurrences of *a* | empty string or 정규식의 기본적인 작동에 대해 익혔으니 여러가지 유용한 연산자들을 살펴보겠습니다.
정규식 연자사들
a? | *a* 가 안나오거나 한번 나와야 함 | 'a' 혹은 빈 문자열 |
|---|---|---|
a* | *a* 가 안나오거나 여러번 나와야 함 | 빈 문자열 혹은 'a', 'aa', 'aaa' |
...
등등 |
|---|
...
a |
|---|
...
+ | *a* |
|---|
...
가 한번 이상 나와야 함 | 'a', 'aa', 'aaa' |
|---|
...
등등 |
|---|
...
a|b |
|---|
...
*a* |
|---|
...
혹은 *b* |
|---|
...
'a' |
|---|
...
혹은 'b' |
|---|
...
...
. | 임의의 문자 하나 | 'a', 'q', 'l', '_', '+' |
|---|
...
등등 |
|---|
...
[woeirjsd] |
|---|
...
주어진 문자 중 하나 | 'w', 'o', 'e', 'i', 'r', 'j', 's', 'd' |
|---|
...
...
[1-9] |
|---|
...
범위 안의 문자 중 하나 | '1', '2', '3', '4', '5', '6', '7', '8', '9' |
|---|
...
...
[^13579] |
|---|
...
주어진 문자가 아닌 다른 문자 하나 | 열거되지 않은 숫자나 문자 | |
|---|---|---|
(ie) | 묶어주기. 다른 연산자와 함께 쓰임 | 'ie' |
^a | 문자열의 시작에 나오는 *a* | 'a' |
a$ | 문자열의 마지막에 나오는 *a* | 'a' |
아직 설명하지 않은 두 가지 사실이 남아 있습니다. 만약 위에 나열된 연산자 중 하나를 실제 문자로 사용하고자 한다면(예를 들면 물음표 등) 그 문자 앞에 '\'를 붙여줘야 합니다. 다음 예제를 참고하세요:
| Code Block |
|---|
// evaluates물음표로 to끝나는 true,문자열만 andtrue로 will for anything ending in a question mark (that doesn't have a question mark in it) 평가됨 "How tall is Angelina Jolie?" ==\~ /\[^\?\]+\?/ |
This is your first really ugly regular expression. (The frequent use of these in PERL is one of the reasons it is considered a "write only" language). By the way, google knows how tall [she is위 코드는 여러분이 보아온 정규식 중 가장 지저분할 것입니다. 이게 바로 PERL 언어가 "쓰기 전용" 언어로 불리는 이유 중 하나죠. 어쨌건, [안젤리나 졸리의 키가 얼마인지|http://www.google.com/search?hl=en&q=how+tall+is+angelina+jolie&btnG=Google+Search] . The only way to understand expressions like this is to pick it apart:
| / | 구글이 알고 있습니다. 이런 종류의 표현식을 이해할 수 있는 유일한 방법은 수식을 여러 조각으로 나눠보는 것입니다:
/ | [^?] |
|---|
...
+ |
|---|
...
? |
|---|
...
/ |
|---|
...
문장 시작 | '?'가 아닌 모든 문자 | 가 여러개 나오고 | 물음표 | 문장 끝 |
|---|
? 앞에 나오는 \ 문자가 ?를 연산자가 아닌 일반 문자로 취급하도록 만든 것입니다.