17

scala.util.matching.Regex trait MatchDataで、グループ名がサポートされていることがわかりました。これは( Regex Named Capturing Groups)に関連していると思いました。

しかし、私が理解しているように、 Javaはバージョン7までグループ名をサポートしていないため( ref)、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でサポートされているNamed Capturing Groupsですか?もしそうなら、そこに例はありますか?

4

2 に答える 2

33

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などのエイリアスを提供します。次に、これらのグループをそれらの名前で参照できます。これらの名前は、パターン自体に固有のものではありません。

于 2010-06-12T18:40:53.323 に答える
2

Scalaには、正規表現マッチングの独自の実装はありません。代わりに、基礎となる正規表現はJavaであるため、パターンの記述の詳細はjava.util.regex.Patternに記載されているものです。

ここで、使用している構文は実際には後読み制約の構文であることがわかりますが、ドキュメントによると、その後に(正の後ろ向き)または(負の後ろ向き)のいずれかを続ける<必要があります。=!

于 2010-06-12T18:37:56.717 に答える