2016-09-19 290 views
0

我有下面的字符串,我想从字符串中只提取List((asdf, asdf), (fff,qqq)),在我想要提取的部分前后有很多其他字符。正则表达式提取括号之间的字符串的一部分

some garbage string PARAMS=List((foo, bar), (foo1, bar1)) some garbage string 

我尝试了这些正则表达式

(?:PARAMS)=(List\((.*?)\)) 
(?:PARAMS)=(List\(([^)]+)\)) 

,但它给了我下面的输出group(1)

List((foo, bar) 
+0

你明确的告诉它只匹配第一个()当你写\(([^)] +)\),没有你意识到了吗? –

+1

试试[this one](http://regexr.com/3e8kn)。 –

回答

1

正则表达式.*List\((.*)\).*工作

使用Scala的正则表达式和模式匹配在一起,然后分裂与任何(,)然后group

正则表达式包含提取

val r = """.*List\((.*)\).*""".r 

图案在正则表达式使用提取匹配

val result = str match { 
       case r(value) => value 
       case _ => "" 
      } 

使用任何的再拆(,)然后group

result.split("""[(|,|)]""").filterNot(s => s.isEmpty || s.trim.isEmpty) 
.grouped(2) 
.toList 
.map(pair => (pair(0), pair(1))).toList 

斯卡拉REPL

scala> val str = """some garbage string PARAMS=List((foo, bar), (foo1, bar1)) some garbage string""" 
str: String = "some garbage string PARAMS=List((foo, bar), (foo1, bar1)) some garbage string" 

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

scala> val result = str match { 
    case r(value) => value 
    case _ => "" 
    } 
result: String = "(foo, bar), (foo1, bar1)" 

scala> result.split("""[(|,|)]""").filterNot(s => s.isEmpty || s.trim.isEmpty).grouped(2).toList.map(pair => (pair(0), pair(1))).toList 
res46: List[(String, String)] = List(("foo", " bar"), ("foo1", " bar1")) 
相关问题