English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Регулярные выражения в Scala

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.

В таблице приведены некоторые часто используемые правила регулярных выражений:

ВыражениеПравила соответствия
^ Соответствует началу вводимой строки.
$Соответствует концу вводимой строки.
.Соответствует любому символу, кроме \r\n
[...]Набор символов. Соответствует любому из символов в наборе. Например, "[abc]" соответствует "a" в "plain".
[^...]Обратный набор символов. Соответствует любому символу, не входящему в набор. Например, "[^abc]" соответствует "plain" в "p", "l", "i", "n".
\\AСоответствует началу вводимой строки (без поддержки многострочных строк)
\\zКонец строки (подобно $, но не зависит от параметра обработки многострочных строк)
\\ZКонец строки или строки (не зависит от параметра обработки многострочных строк)
re*Повторение нуля или более раз
re+Повторение одного или более раз
re?Повторение нуля или одного раза
re{ n}Повторение n раз
re{ n,}Повторение n раз или более
re{ n, m}Повторение n до m раз
a|bСоответствует a или b
(re)Соответствует re, и текст соответствия сохраняется в автоматически названном разделе
(?: re)Соответствует re, не запоминает соответствующий текст, не assigns group number к этому разделу
(?> re)Жадный подвыражение
\\wСоответствует буквам или цифрам или подчеркивающему символу или китайскому символу
\\WСоответствует любому символу, кроме букв, цифр, подчеркивающего символа, китайского символа
\\sСоответствует любому пробельному символу, эквивалентно [\t\n\r\f]
\\SСоответствует любому символу, кроме пробельного
\\dСоответствует цифрам, подобно [0-9]
\\DСоответствует любому символу, кроме цифрового
\\GНачало текущего поиска
\\nПеренос строки
\\bОбычно это место разделения слов, но если используется в классе символов, означает后退
\\BСоответствует положению, не являющемуся началом или концом слова
\\tТабуляция
\\QНачало кавычек:\Q(a+b)*3\E Может соответствовать тексту "(a+b)*3".
\\EКонец кавычек:\Q(a+b)*3\E Может соответствовать тексту "(a+b)*3".

Пример регулярного выражения

ПримерОписание
.Соответствует любому символу, кроме \r\n
[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Соответствует пробельным символам, подобно: [ \t\r\n\f]
\\SСоответствует непробельным символам, подобно: [^ \t\r\n\f]
\\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)+/Группировка: + повторение \D\d
([Rr]uby(, )?)+Соответствие "Ruby", "Ruby, ruby, ruby" и т.д.

Обратите внимание, что каждый символ в таблице используется дважды. Это связано с тем, что в Java и Scala обратная косая черта являетсязнаком escape. Поэтому, если вы хотите вывести \, вам нужно записать его как \\ в строке, чтобы получить один обратный слеш. Вот пример:

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