簡體   English   中英

通過 Scala 中的正則表達式模式匹配提取字符串的重復部分

[英]Extract the repetitive parts of a String by Regex pattern matching in Scala

我有這段代碼用於提取正則表達式的重復:分隔部分,它沒有給我正確的 output。

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")
   }

我究竟做錯了什么?

如何編寫允許我提取每個: pattern正則表達式的分隔部分的 case 表達式?

解決這個問題的正確語法是什么?

如何與從正則表達式中提取的未知數量的 arguments 進行匹配?

在這種情況下打印:

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 演示 正則表達式詳細信息

  • \b - 單詞邊界
  • [a-zA-Z]+ - 一個或多個 ASCII 字母
  • (?::[a-zA-Z]+)* - 零次或多次重復
    • : - 一個冒號
    • [a-zA-Z]+ - 一個或多個 ASCII 字母
  • \b - 單詞邊界

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM