Подтвердить что ты не робот

Scala regex Именованные группы захвата

В scala.util.matching.Regex trait MatchData Я вижу, что там поддерживаются имена групп, я думал, что это связано с (Группы именованных групп повторного поиска)

Но поскольку Java не поддерживает имена групп до версии 7, как я ее понимаю (ref), Scala версия 2.8.0 (Java HotSpot (TM) 64-разрядная серверная VM, Java 1.6. дает мне это исключение:

scala> val pattern = """(?<login>\w+) (?<id>\d+)""".r
java.util.regex.PatternSyntaxException: Look-behind group does not have an obvio
us maximum length near index 11
(?<login>\w+) (?<id>\d+)
           ^
        at java.util.regex.Pattern.error(Pattern.java:1713)
        at java.util.regex.Pattern.group0(Pattern.java:2488)
        at java.util.regex.Pattern.sequence(Pattern.java:1806)
        at java.util.regex.Pattern.expr(Pattern.java:1752)
        at java.util.regex.Pattern.compile(Pattern.java:1460)

Итак, вопрос: Named Capturing Groups поддерживаются в Scala? Если да, то есть какие-то примеры?

4b9b3361

Ответ 1

Я боюсь, что группы с именем Scala не определены одинаково. Это не что иное, как псевдоним после обработки для неназванных (т.е. Только нумерованных) групп в исходном шаблоне.

Вот пример:

import scala.util.matching.Regex

object Main {
   def main(args: Array[String]) {
      val pattern = new Regex("""(\w*) (\w*)""", "firstName", "lastName");
      val result = pattern.findFirstMatchIn("James Bond").get;
      println(result.group("lastName") + ", " + result.group("firstName"));
   }
}

Это печатает (как показано на ideone.com):

Bond, James

Что происходит здесь, так это то, что в конструкторе для Regex мы предоставляем псевдонимы для групп 1, 2 и т.д. Затем мы можем ссылаться на эти группы по этим именам. Эти имена не являются внутренне присущими самим шаблонам.

Ответ 2

Scala не имеет собственной привязки соответствия регулярных выражений. Вместо этого базовыми регулярными выражениями являются Java, поэтому детали написания шаблонов описаны в файле java.util.regex.Pattern.

Там вы обнаружите, что синтаксис, который вы используете, на самом деле относится к внешнему ограничению, хотя согласно документам < должен следовать либо = (положительный внешний вид), либо ! (отрицательный внешний вид).