2016-10-25 2 views
0

Моей программе Scala предоставляется строка, которая может содержать или не содержать токен «flimFlam(*)», где звездочка представляет любой текст, символы, знаки препинания и т. Д. Всегда будет только 0 или 1 экземпляр «flimFlam(*)» в этой строке, никогда больше.Извлечение внутренней группы с помощью регулярного выражения Scala

Мне нужно определить, содержит ли данная строка ввода экземпляр «flimFlam(*)», и если это так, извлеките все, что находится внутри двух круглых скобок. Следовательно, если моя строка содержит «flimFlam(Joe)», то результатом будет строка со значением «Joe» и т.д.

Моя лучшая попытка до сих пор:

val inputStr : String = "blah blah flimFlam(Joe) blah blah" 

// Regex must be case-sensitive for "flimFlam" (not "FLIMFLAM", "flimflam", etc.) 
val flimFlamRegex = ".*flimFlam\\(.*?\\)".r 
val insideTheParens = flimFlamRegex.findFirstIn(inputStr) 
Может

кто-нибудь место, где я неужели?

ответ

2

согласование использования модели и экстрактор

val regex = ".*flimFlam\\((.*)\\).*".r 

inputStr match { 
case regex(x) => println(x) 
case _ => println("no match") 
} 

Scala РЕПЛО

scala> val inputStr : String = "blah blah flimFlam(Joe) blah blah" 
inputStr: String = blah blah flimFlam(Joe) blah blah 

scala> val regex = ".*flimFlam\\((.*)\\).*" 
regex: String = .*flimFlam\((.*)\).* 

scala> val regex = ".*flimFlam\\((.*)\\).*".r 
regex: scala.util.matching.Regex = .*flimFlam\((.*)\).* 

scala> inputStr match { case regex(x) => println(x); case _ => println("no match")} 
Joe 
+0

unanchored как в другом ответе удобно знать (и продвигать). –

0

регулярных выражений Вы можете использовать захват группу вокруг .*? и просто использовать unanchored регулярного выражения в match блока так, чтобы шаблон мог оставайтесь короткими и «хорошенькими» (не нужно .* вокруг значения, которое вы ищете):

var str = "blah blah flimFlam(Joe) blah blah" 
val pattern = """flimFlam\((.*?)\)""".r.unanchored 
val res = str match { 
    case pattern(res) => println(res) 
    case _ => "No match" 
} 

См online demo

Кроме того, обратите внимание, что вам не нужно, чтобы два раза подряд в """ -quoted строковых литералов, которые помогают избежать чрезмерного обратной косой черты.

И подсказка: если flimFlam этого целого слова, добавьте \b перед - """\bflimFlam\((.*?)\)""".

Смежные вопросы