2015-07-01 12 views
0

У меня есть этот подробный код, который выполняет извлечение/совпадение коротких замыканий в Scala. Это пытается сопоставить строку с первым Regex, если она не соответствует, она пытается сопоставить строку со вторым Regex.Scala Regex Extractor с оператором OR

val regex1 : scala.util.matching.Regex = "^a(b)".r 
val regex2 : scala.util.matching.Regex = "^c(d)".r 

val s = ? 
val extractedGroup1 : Option[String] = s match { case regex1(v) => Some(v) case _ => None } 
val extractedGroup2 : Option[String] = s match { case regex2(v) => Some(v) case _ => None} 

val extractedValue = extractedGroup1.orElse(extractedGroup2) 

Вот результаты:

сек == "аб", то extractedValue == "б"

сек == "CD", а затем extractedValue == "с"

s == "gg" then extractValue == None.

Мой вопрос в том, как мы можем объединить два регулярных выражения в одно регулярное выражение с регулярным выражением или оператором и использовать экстракторы Scala. Я попробовал это, но это всегда дело Ничего.

val regex : scala.util.matching.Regex = "^a(b)$ | ^c(d)$".r 
val extractedValue: s match { case regex(v) => Some(v) case _ => None } 

ответ

0

Не используйте качество жизни пространств в регулярном выражении, хотя они чувствуют себя очень SCALA-эск, они могут быть приняты литературные и ваша программа ожидает, что там должен быть пробел после endOfString или пространство перед startOfString , что, очевидно, никогда не бывает. Попробуйте ^(?:a(b)|c(d))$, это то же самое, что и вы, не повторяя ^ и $.

Ваш собственный ^a(b)$|^c(d)$ также может работать (если вы удалите пробелы).

Кроме того, вы действительно получаете c из cd? Судя по вашему регулярному выражению, вы должны получать d, если речь идет о группах захвата.

Также обратите внимание, что вы извлекаете группы захвата. Если вы объедините регулярные выражения, извлеченный d будет равен $ 2, а b - $ 1.

+0

Также стоит отметить, что анкеры являются посторонними, так как выпрямитель соответствия шаблону regex.match весь вход. В этом простом случае '{case r1 (v) => Некоторое (v) случай r2 (v) => Some (v)}' более очевидно. Кроме того, используйте '(? X)' для игнорирования встроенных пробелов. –

+0

Вы можете использовать оригинальную формулировку, используя 'unapplySeq' или:' r1.findFirstMatchIn (s) илиElse r2.findFirstMatchIn (s) map (_ group 1) '. –