scala:获取正则表达式的所有可能匹配项

时间:2012-11-06 13:42:33

标签: regex scala

我需要找到所有用“和”字加入的单词对。

到目前为止,我尝试了以下内容:

val salute = """.*?(\w+\W+)and(\W+\w+).*""".r

val salute(a,b) = "hello ladies and gentlemen, mesdames and messieurs, how are you?"
a: String = "ladies "
b: String = " gentlemen"

现在我想要这样的事情:

salute.findAllMatches("hello ladies and gentlemen, mesdames and messieurs, how are you?")
List[(java.lang.String, java.lang.String)] = List((ladies,gentlemen), (mesdames,mesieurs))

我试过

salute.findAllIn("hello ladies and gentlemen, mesdames and messieurs, how are you?").toList
res14: List[String] = List(hello ladies and gentlemen, mesdames and messieurs, how are you?)

但是,正如你所看到的,没有成功......

2 个答案:

答案 0 :(得分:3)

你的正则表达式

.*?(\w+\W+)and(\W+\w+).*
由于。*之前和之后,

已经匹配所有内容。将其更改为(或根据要求类似):

(\w+\W+)and(\W+\w+)

答案 1 :(得分:0)

如上所述,要将结果作为元组列表获取,您可以执行以下两项操作:

将你的正则表达式改为不那么贪心,即不立刻消耗整个字符串 例如:

""".(\w+) and (\w+)""".r

使用 findAllIn 并在所有匹配项上使用RegexExtractor来获取捕获的parantheses中的部分

将所有内容放在一起产生所需结果的解决方案可能如下所示:

val salute = """.(\w+) and (\w+)""".r
val string = "hello ladies and gentlemen, mesdames and messieurs, how are you?"

val results = for {
  salute(left,right) <- (salute findAllIn string)
} yield (left,right)

println(results toList)

结果

List((ladies,gentlemen), (mesdames,messieurs))