问题描述
我有这段代码用于提取正则表达式中重复的 :
分隔部分,但它没有给我正确的输出。
val pattern = """([a-zA-Z]+)(:([a-zA-Z]+))*""".r
for (p <- pattern findAllIn "it:is:very:great just:because:it is") p match {
case pattern("it",pattern(is,pattern(very,great))) => println("it: "+ is + very+ great)
case pattern(it,_,rest) => println( it+" : "+ rest)
case pattern(it,is,very,great) => println(it +" : "+ is +" : "+ very +" : " + great)
case _ => println("match failure")
}
我做错了什么?
如何编写一个 case 表达式来提取 :
正则表达式的每个 pattern
分隔部分?
解决这个问题的正确语法是什么?
在这种情况下打印:
it : is : very : great
just : because : it
is
解决方法
不能像这样重复使用捕获组,它只会将最后捕获的值保存为当前组值。
您仍然可以使用 \b[a-zA-Z]+(?::[a-zA-Z]+)*\b
正则表达式获取所需的匹配项,然后使用 :
拆分每个匹配项:
val text = "it:is:very:great just:because:it is"
val regex = """\b[a-zA-Z]+(?::[a-zA-Z]+)*\b""".r
val results = regex.findAllIn(text).map(_ split ':').toList
results.foreach { x => println(x.mkString(",")) }
// => it,is,very,great
// just,because,it
// is
参见Scala demo。 正则表达式详情:
-
\b
- 词边界 -
[a-zA-Z]+
- 一个或多个 ASCII 字母 -
(?::[a-zA-Z]+)*
- 零次或多次重复-
:
- 一个冒号 -
[a-zA-Z]+
- 一个或多个 ASCII 字母
-
-
\b
- 词边界