Я хотел бы найти совпадение между первой буквой слова и одной из букв в группе, такой как «ABC». В псевдокоде это может выглядеть примерно так:
case Process(word) =>
word.firstLetter match {
case([a-c][A-C]) =>
case _ =>
}
}
Но как мне взять первую букву в Scala вместо Java? Как правильно выразить регулярное выражение? Можно ли это сделать в классе case ?
[a-cA-C]
это регулярное выражение.Traversable
(вродеList
иArray
), если вы хотите первые 3 символа, попробуйте"my string".take(3)
, для первого"foo".head
Ответы:
Вы можете сделать это, потому что регулярные выражения определяют экстракторы, но сначала вам нужно определить шаблон регулярного выражения. У меня нет доступа к Scala REPL, чтобы проверить это, но что-то вроде этого должно работать.
источник
val Pattern = "[a-cA-C]".r
не будет работать. Это связано с темunapplySeq(target: Any): Option[List[String]]
, что используется case-case , который возвращает совпадающие группы.val r = "[A-Ca-c]".r ; 'a' match { case r() => }
. scala-lang.org/api/current/#scala.util.matching.Regexval r = "([A-Ca-c])".r ; "C" match { case r(_*) => }
.Начиная с версии 2.10, можно использовать функцию интерполяции строк в Scala:
Еще лучше можно связать группы регулярных выражений:
Также возможно установить более детальные механизмы привязки:
Впечатляющий пример того, что возможно с помощью
Dynamic
, показан в сообщении блога Introduction to Type Dynamic :источник
$
знака в качестве образца конца строки: компилятор жалуется на отсутствие завершения строки.case p.firstName.lastName.Map(...
шаблон - как я могу это прочитать?Regex
каждый раз, когда проверяется соответствие. И это довольно дорогостоящая операция, связанная с компиляцией шаблона регулярного выражения.Как указал Делнан,
match
ключевое слово в Scala не имеет ничего общего с регулярными выражениями. Чтобы узнать, соответствует ли строка регулярному выражению, вы можете использоватьString.matches
метод. Чтобы узнать, начинается ли строка с a, b или c в нижнем или верхнем регистре, регулярное выражение будет выглядеть так:Вы можете прочитать это регулярное выражение как «один из символов a, b, c, A, B или C, за которым следует что-нибудь» (
.
означает «любой символ» и*
означает «ноль или более раз», поэтому «. *» - это любая строка) ,источник
Чтобы немного расширить ответ Эндрю : тот факт, что регулярные выражения определяют экстракторы, можно использовать для разложения подстрок, сопоставленных регулярным выражением, очень красиво, используя сопоставление с образцом Scala, например:
источник
[]
) каретка указывает на отрицание, поэтому[^\s]
означает «без пробелов».String.matches - это способ сопоставления с образцом в смысле регулярного выражения.
Но как удобный случай word.firstLetter в реальном коде Scala выглядит так:
Scala обрабатывает строки как последовательность символов Char, поэтому, если по какой-то причине вы хотите явно получить первый символ строки и сопоставить его, вы можете использовать что-то вроде этого:
Я не предлагаю это как общий способ сопоставления с образцом регулярного выражения, но он соответствует предложенному вами подходу: сначала найти первый символ строки, а затем сопоставить его с регулярным выражением.
РЕДАКТИРОВАТЬ: Чтобы быть ясным, я бы сделал это, как говорили другие:
Просто хотел показать пример, максимально приближенный к вашему исходному псевдокоду. Ура!
источник
"Cat"(0).toString
Можно было бы более ясно написать как"Cat" take 1
, имхо.val r = "[A-Ca-c]".r ; "cat"(0) match { case r() => }
.Обратите внимание, что подход из ответа @ AndrewMyers сопоставляет всю строку с регулярным выражением с эффектом привязки регулярного выражения к обоим концам строки с помощью
^
и$
. Пример:И без
.*
конца:источник
val MY_RE2 = "(foo|bar)".r.unanchored ; "foo123" match { case MY_RE2(_*) => }
. Более идиоматично,val re
без заглавных букв.Сначала мы должны знать, что регулярное выражение можно использовать отдельно. Вот пример:
Во-вторых, мы должны заметить, что сочетание регулярного выражения с сопоставлением с образцом было бы очень эффективным. Вот простой пример.
Фактически, регулярное выражение само по себе уже очень мощно; единственное, что нам нужно сделать, это сделать его более мощным с помощью Scala. Вот еще несколько примеров в документе Scala: http://www.scala-lang.org/files/archive/api/current/index.html#scala.util.matching.Regex
источник