스칼라 정규식


Scala는 scala.util.matching 패키지의 Regex 클래스를 통해 정규식을 지원합니다. 다음 예에서는 정규 표현식을 사용하여 Scala라는 단어를 찾는 방법을 보여줍니다.

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = "Scala".r
      val str = "Scala is Scalable and cool"
      
      println(pattern findFirstIn str)
   }
}

위 코드를 실행하면 출력 결과는 다음과 같습니다.

$ scalac Test.scala 
$ scala Test
Some(Scala)

r() 사용 예제에서 String 클래스의 메소드는 Regex 객체를 생성했습니다.

그런 다음 findFirstIn 메소드를 사용하여 첫 번째 일치 항목을 찾습니다.

모든 일치 항목을 보려면 findAllIn 메소드를 사용할 수 있습니다.

mkString() 메소드를 사용하여 정규식 일치 결과의 문자열을 연결할 수 있으며 파이프(|)를 사용하여 다양한 모드를 설정할 수 있습니다.

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")  // 首字母可以是大写 S 或小写 s
      val str = "Scala is scalable and cool"
      
      println((pattern findAllIn str).mkString(","))   // 使用逗号 , 连接返回结果
   }
}

위 코드를 실행하고 출력합니다. 결과:

$ scalac Test.scala 
$ scala Test
Scala,scala

일치하는 텍스트를 지정된 키워드로 바꿔야 하는 경우 replaceFirstIn( ) 메서드를 사용하여 첫 번째 일치 항목을 바꿀 수 있습니다. replaceAllIn( ) 메소드는 일치하는 모든 항목을 대체합니다.

object Test {
   def main(args: Array[String]) {
      val pattern = "(S|s)cala".r
      val str = "Scala is scalable and cool"
      
      println(pattern replaceFirstIn(str, "Java"))
   }
}

위 코드를 실행하면 출력 결과는 다음과 같습니다.

$ scalac Test.scala 
$ scala Test
Java is scalable and cool

정규 표현식

Scala의 정규 표현식 수식은 Java의 구문 규칙을 상속하며 Java는 대부분 Perl 언어의 규칙을 사용합니다.

다음 표에는 일반적으로 사용되는 정규식 규칙이 나와 있습니다.

<n회 이상 반복<td="">
表达式匹配规则
^ 匹配输入字符串开始的位置。
$匹配输入字符串结尾的位置。
.匹配除"rn"之外的任何单个字符。
[...]字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。
[^...]反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。
\A匹配输入字符串开始的位置(无多行支持)
\z字符串结尾(类似$,但不受处理多行选项的影响)
\Z字符串结尾或行尾(不受处理多行选项的影响)
re*重复零次或更多次
re+重复一次或更多次
re?重复零次或一次
re{ n}重复n次
re{ n,}
re{ n, m}重复n到m次
a|b匹配 a 或者 b
(re)匹配 re,并捕获文本到自动命名的组里
(?: re)匹配 re,不捕获匹配的文本,也不给此分组分配组号
(?> re)贪婪子表达式
\w匹配字母或数字或下划线或汉字
\W匹配任意不是字母,数字,下划线,汉字的字符
\s匹配任意的空白符,相等于 [tnrf]
\S匹配任意不是空白符的字符
\d匹配数字,类似 [0-9]
\D匹配任意非数字的字符
\G当前搜索的开头
\n换行符
\b通常是单词分界位置,但如果在字符类里使用代表退格
\B匹配不是单词开头或结束的位置
\t制表符
\Q开始引号:Q(a+b)*3E 可匹配文本 "(a+b)*3"。
\E结束引号:Q(a+b)*3E 可匹配文本 "(a+b)*3"。

정규식 예

实例描述
.匹配除"rn"之外的任何单个字符。
[Rr]uby匹配 "Ruby" 或 "ruby"
rub[ye]匹配 "ruby" 或 "rube"
[aeiou]匹配小写字母 :aeiou
[0-9]匹配任何数字,类似 [0123456789]
[a-z]匹配任何 ASCII 小写字母
[A-Z]匹配任何 ASCII 大写字母
[a-zA-Z0-9]匹配数字,大小写字母
[^aeiou]匹配除了 aeiou 其他字符
[^0-9]匹配除了数字的其他字符
\d匹配数字,类似: [0-9]
\D匹配非数字,类似: [^0-9]
\s匹配空格,类似: [ trnf]
\S匹配非空格,类似: [^ trnf]
\w匹配字母,数字,下划线,类似: [A-Za-z0-9_]
\W匹配非字母,数字,下划线,类似: [^A-Za-z0-9_]
ruby?匹配 "rub" 或 "ruby":  y 是可选的
ruby*匹配 "rub" 加上 0 个或多个的 y。
ruby+匹配 "rub" 加上 1 个或多个的 y。
\d{3}刚好匹配 3 个数字。
\d{3,}匹配 3 个或多个数字。
\d{3,5}匹配 3 个、4 个或 5 个数字。
\D\d+无分组: + 重复 d
(\D\d)+/分组: + 重复 Dd 对
([Rr]uby(, )?)+匹配 "Ruby"、"Ruby, ruby, ruby",等等

위 표의 각 문자는 두 개의 백슬래시를 사용합니다. 이는 문자열의 백슬래시가 Java 및 Scala에서 이스케이프 문자이기 때문입니다. 따라서 ..를 출력하려면 문자열에 .\.를 적어서 백슬래시를 얻어야 합니다. 다음 예를 확인하세요.

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]\d+")
      val str = "ablaw is able1 and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

위 코드를 실행하면 출력 결과는 다음과 같습니다.

$ scalac Test.scala 
$ scala Test
able1