Получение списка из экстрактора - или даже соответствия - PullRequest
0 голосов
/ 21 декабря 2010

Сначала я был как круто ...

scala> var nameRE = """\W*(\w+)\W+(\w+)\W*""".r
nameRE: scala.util.matching.Regex = \W*(\w+)\W+(\w+)\W*

scala> var nameRE(first, last) = "Will Smith " 
first: String = Will
last: String = Smith

Тогда я был как штопать ...

scala> var listOfVowels = "(([aeiou])*)".r
listOfVowels: scala.util.matching.Regex = (([aeiou])*)

scala> var listOfVowels(vowels:List[String]) = "uoiea"
<console>:7: error: scrutinee is incompatible with pattern type;
 found   : List[String]
 required: java.lang.String
       var listOfVowels(vowels:List[String]) = "uoiea"

Теперь я похож на хах ...

scala> (listOfVowels findFirstMatchIn "uoiea" get) subgroups
res35: List[String] = List(a)

[Если мой вопрос не очевиден: как я могу получить список всех подгрупп, фактически сопоставленных с шаблоном,в идеале в экстракторе, но в любом случае без написания сопоставителя второго уровня.Правильный ответ здесь будет, конечно, List(u, o, i, e, a).]

Ответы [ 3 ]

2 голосов
/ 22 декабря 2010

Это позволит вам извлечь шаблон:

scala> var listOfVowels(vowels @ _*) = "uoiea"
vowels: Seq[String] = List(uoiea, a)

Однако шаблон не делает то, что вы ожидаете - он не генерирует несколько групп.Правило библиотеки регулярных выражений - это один набор скобок, одна группа, и каждое знакомое регулярное выражение работает таким образом.

2 голосов
/ 21 декабря 2010

Насколько мне известно, невозможно преобразовать подшаблон типа (E) * в регулярном выражении в список строк.Это может быть связано с тем, что механизм регулярных выражений, используемый в Scala, реализован с использованием реализации JDK по умолчанию для регулярных выражений (java.util.Pattern, java.util.Matcher и т. Д.), И эта реализация просто не поддерживает захват множественных подшаблонов.В случае совпадения подшаблон (E) * будет захватывать только последнее совпадение для этого подшаблона.Насколько мне известно, такое поведение сохраняется даже для большинства реализаций регулярных выражений.

Хотя я считаю, что ваш случай является упрощенной версией вашей реальной проблемы, простое решение для описанного случая существует:

scala> "[aeiou]".r findAllIn "hello, world!" toList
res1: List[String] = List(e, o, o)

Надеюсь, это поможет.

1 голос
/ 23 декабря 2010

Это немного стилистически неряшливо.

scala> implicit def mkRr(regex: String) = new { def rr = new { def unapply(s: String) = (regex.r findAllIn s toList) match { case Nil => None ; case xs => Some(xs) } } }
mkRr: (regex: String)java.lang.Object{def rr: java.lang.Object{def unapply(s: String): Option[List[String]]}}

scala> val ListOfVowels = "[aeiou]".rr
ListOfVowels: java.lang.Object{def unapply(s: String): Option[List[String]]} = $anon$1$$anon$2@49f2afad

scala> val ListOfVowels(vowels) = "uoiea"
vowels: List[String] = List(u, o, i, e, a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...