簡體   English   中英

Scala正則表達式命名為捕獲組

[英]Scala regex Named Capturing Groups

scala.util.matching.Regex trait MatchData中我看到支持組名,我認為這與( Regex Named Capturing Groups )有關

但是由於Java在版本7之前不支持組名,因為我理解它( 參考 ), Scala版本2.8.0(Java HotSpot(TM)64位服務器VM,Java 1.6。)給了我這個例外:

scala> val pattern = """(?<login>\w+) (?<id>\d+)""".r
java.util.regex.PatternSyntaxException: Look-behind group does not have an obvio
us maximum length near index 11
(?<login>\w+) (?<id>\d+)
           ^
        at java.util.regex.Pattern.error(Pattern.java:1713)
        at java.util.regex.Pattern.group0(Pattern.java:2488)
        at java.util.regex.Pattern.sequence(Pattern.java:1806)
        at java.util.regex.Pattern.expr(Pattern.java:1752)
        at java.util.regex.Pattern.compile(Pattern.java:1460)

所以問題是Scala支持的命名捕獲組? 如果是這樣的話有什么例子嗎?

我擔心Scala的命名組沒有以相同的方式定義。 它只是原始模式中未命名(即剛編號)組的后處理別名。

這是一個例子:

import scala.util.matching.Regex

object Main {
   def main(args: Array[String]) {
      val pattern = new Regex("""(\w*) (\w*)""", "firstName", "lastName");
      val result = pattern.findFirstMatchIn("James Bond").get;
      println(result.group("lastName") + ", " + result.group("firstName"));
   }
}

打印( 如ideone.com上所示 ):

Bond, James

這里發生的是在Regex的構造函數中,我們為組1,2等提供別名。然后我們可以通過這些名稱來引用這些組。 這些名稱本身並不是模式本身。

Scala沒有自己的正則表達式匹配的實現。 相反,底層正則表達式是Java,因此編寫模式的細節是java.util.regex.Pattern中記錄的那些。

在那里你會發現你使用的語法實際上是后視約束的語法,但根據文檔, <必須跟着= (正面后視)或! (負面觀察)。

暫無
暫無

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

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