2010-06-12 70 views
16

scala.util.matching.Regex trait MatchData我看到有對組名支持,我認爲這是有關(Regex Named Capturing Groups斯卡拉正則表達式命名捕獲組

但由於Java does not support groupnames until version 7按照我的理解(ref),斯卡拉2.8.0版( 。Java的熱點(TM)64位服務器VM,Java 1.6的給了我這樣的例外:在Scala中支持

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) 

所以現在的問題是命名捕獲組,如果是這樣的任何例子在那裏

? 0

回答

21

恐怕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")); 
    } 
} 

此打印(as seen on ideone.com):

Bond, James 

這裏會發生什麼事是,在構造爲Regex,我們提供了1組,2別名,等等。然後我們可以通過這些名稱來引用這些組。這些名稱在模式本身中不是固有的。

+2

謝謝。沒有爲此重載RichString.r。 – oluies 2010-06-12 18:57:00

+0

這仍然是與Java7在scala 2.11中的行爲? – javadba 2015-09-21 19:13:49

+2

@javadba它仍然是。現在你也可以做'val pattern =「」「(\ w *)(\ w *)」「」。r(「firstName」,「lastName」);' – Majki 2015-10-22 07:37:21

2

Scala沒有自己的正則表達式匹配實例。相反,底層的正則表達式是Java的,所以編寫模式的細節是在java.util.regex.Pattern中記錄的。

在那裏,你會發現你正在使用的語法實際上就是向後看的約束,但根據文檔的<必須跟任何=(正向後看)或!(負look-背後)。

+2

這是很久以前應該被標記爲錯誤的東西。儘管它應該會引發異常,但消息應該是「未知的後臺組」(顯然是有意的),或者更好的是「未知組類型」。當然,它在JDK 1.7中被固定爲添加命名組的副作用。 – 2010-06-13 00:41:00

+0

從JDK7開始,這不再是真實的 - 在JDK中支持組名,但在scala中不支持。 – javadba 2015-09-21 22:30:56