Scala regex Named Capturing Groups

В scala.util.matching. Черта Regex MatchData, я вижу, что там поддерживают для groupnames, я думал, что это было связано с (Regex Под названием Группы фиксации)

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

scala> val pattern = """(?\w+) (?\d+)""".r
java.util.regex.PatternSyntaxException: Look-behind group does not have an obvio
us maximum length near index 11
(?\w+) (?\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? Раз так какие-либо примеры там?

16
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

Боюсь, что именованные группы 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 и т. д. Затем мы можем ссылаться на эти группы по этим именам. Эти имена не являются неотъемлемой частью самих паттернов.

26
ответ дан 30 November 2019 в 21:10
поделиться

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

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

2
ответ дан 30 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: