스칼라에서 정규식으로 작업하기
정규식은 입력 데이터를 일치시키는 데 사용되는 공통 패턴을 정의합니다. 이는 패턴 일치 및 텍스트 처리 또는 구문 분석에 매우 유용합니다.
이 기사에서는 스칼라에서 Regex(정규식)를 사용하는 방법을 배웁니다.
스칼라의 Regex
클래스
Regex
는 패턴 일치 및 텍스트 구문 분석에 광범위하게 사용되는 Java 패키지 java.util.regex
를 기반으로 scala.util.matching.Regex
에서 가져온 Scala의 클래스입니다. ‘Regex’ 객체는 두 가지 방법으로 생성할 수 있습니다.
첫 번째 방법은 Regex
클래스 개체를 명시적으로 생성하는 것입니다.
val x = new Regex("you")
두 번째 방법은 r
방법을 사용하는 것입니다.
val x = "You".r
Regex
를 사용하여 정규 표현식의 다양한 사용 사례를 살펴보겠습니다.
Scala의 텍스트에서 일치 항목 찾기
텍스트에서 일치 항목을 찾는 것은 Regex의 가장 일반적인 사용 사례 중 하나입니다.
예제 코드:
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String])
{
val x = new Regex("Tony")
val text = "Iron man is also known as Tony Stark. Tony is an Avenger"
println(x findFirstIn text)
}
}
출력:
Some(Tony)
위의 코드에서는 findFirstIn
메서드를 사용하여 정규식의 첫 번째 일치 항목을 찾았고 이 메서드는 Option[String]
개체를 반환합니다.
예제 코드:
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
println((reg findAllIn text).mkString(","))
}
}
출력:
01-011,30-059
위의 예에서 findAllIn
메소드를 사용하여 모든 일치 항목을 찾고 MatchIterator
를 반환했습니다. 그런 다음 mkString
메서드를 사용하여 ,
(쉼표)로 구분된 문자열로 출력을 변환했습니다.
findFirstMatchIn
메소드도 있습니다. findFirstIn
메소드처럼 작동하지만 Option[Match]
를 반환합니다.
예제 코드:
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
val result = reg.findFirstMatchIn(text)
println(Some("011"), for (x <- result) yield x.group(2))
}
}
출력:
(Some(011),Some(011))
Regex
를 사용하여 Scala에서 텍스트 바꾸기
이것은 텍스트를 대체하는 Regex
의 또 다른 사용 사례입니다. 때때로 텍스트 구문 분석 중 일부를 다른 것으로 대체했을 수 있습니다.
예제 코드:
import scala.util.matching.Regex
object myClass
{
// Main method
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
println(reg replaceFirstIn(text, "1234"))
}
}
출력:
He lives in Warsaw 1234 and she lives in Cracow 30-059
위의 코드에서 replaceFirstIn
메서드를 사용하여 텍스트에서 찾은 첫 번째 일치 항목을 "1234"
문자열로 교체했습니다.
예제 코드:
import scala.util.matching.Regex
object myClass
{
// Main method
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
println(reg replaceAllIn(text, "1234"))
}
}
출력:
He lives in Warsaw 1234 and she lives in Cracow 1234
위의 코드에서 replaceAllIn
메소드를 사용했는데, 이는 텍스트에서 발견된 모든 일치 항목을 "1234"
로 대체합니다.
Regex
를 사용하여 Scala에서 값 추출
정규 표현식과 일치하는 항목을 찾으면 Regex
를 사용하여 패턴 일치를 사용하여 값을 추출할 수 있습니다.
예제 코드:
import scala.util.matching.Regex
object myClass {
def main(args: Array[String]) {
val timestamp = "([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3})".r
val time = "12:20:01.411" match {
case timestamp(hour, minutes, _, _) => println(s"It is $minutes minutes after $hour")
}
}
}
출력:
It is 20 minutes after 12
Scala에서 Regex
는 기본적으로 패턴이 anchor
된 것처럼 동작합니다. 예를 들어, 패턴은 ^pattern$
과 같은 ^
및 $
문자 중간에 배치되지만 UnanchoredRegex
클래스에 있는 unanchored
메서드를 사용하여 이러한 문자를 제거할 수 있습니다.
이 도움으로 문자열에 추가 텍스트가 있으면서도 여전히 필요한 것을 찾을 수 있습니다.
예제 코드:
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String]) {
val timestamp = "([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3})".r
val temp = timestamp.unanchored
val time = "It is 12:20:01.411 in New York" match {
case temp(hour, minutes, _, _) => println(s"It is $minutes minutes after $hour")
}
}
}
출력:
It is 20 minutes after 12
Java는 Perl 프로그래밍 언어에서 대부분의 정규식과 Regex
기능을 상속하고 Scala는 Java에서 정규식 구문을 상속합니다.
자바에서 가져온 스칼라의 일반적으로 사용되는 정규 표현식을 살펴보자.
하위 표현식 | 성냥 |
---|---|
^ |
줄의 시작 부분과 일치합니다. |
$ |
끝의 시작과 일치합니다. |
[...] |
대괄호에 있는 단일 문자를 일치시키는 데 사용됩니다. |
[^...] |
대괄호에 없는 단일 문자를 일치시키는 데 사용됩니다. |
\\w |
단어 문자를 일치시키는 데 사용됩니다. |
\\d |
숫자를 일치시키는 데 사용됩니다. |
결론
이 기사에서는 Scala 표준 라이브러리에 있는 Regex
클래스에 대해 배웠습니다. 또한 정규 표현식
의 다양한 사용 사례를 처리하는 데 도움이 되는 다양한 API를 제공하는 방법도 보았습니다.