2

この質問から正規表現を試しました:URLからドメイン名を取得する方法

しかし、ドメイン名が見つかりません。ここに私の実装があります:

    val Names = """.*([^\.]+)(com|net|org|info|coop|int|co\.uk|org\.uk|ac\.uk|uk|__and so on__)$""".r
    val s = Names.findFirstIn("www.google.com")
    s match {
    case Some(name) =>
        println(name)
    case None =>
        println("No name value")
    }

「名前の値がありません」が一貫して標準出力に出力されます。正規表現または私の Scala 実装に問題はありますか?

4

3 に答える 3

2

Scala 2.10 の文字列補間機能を使用します。

implicit class Regex(sc: StringContext) {
  def r = new util.matching.Regex(sc.parts.mkString, sc.parts.tail.map(_ => "x"): _*)
}

scala> "www.google.co.uk" match {
      case  r"(.*?)$sld([^.]+)$domain\.(com|net|org|co\.uk)$tld" => (sld,domain,tld)
      case _ => ???
    }
res61: (String, String, String) = (www,google,co.uk)

このアプローチの問題は、変数を使用して各グループを常にキャプチャする必要があることです。これを無効にするには、非キャプチャ グループ (で始まる?:)を明示的に追加する必要があります。

r".*?([^.]+)$domain\.(?:com|net|org|co\.uk)"

最初のグループについては、完全に省略することもできます。

入力文字列を常に一致させることができると確信している場合は、パターン一致の一致しない部分を除外することもできます。

scala> val r".*?([^.]+)$domain\.(?:com|net|org|co\.uk)" = "www.google.com"
domain: String = google
于 2013-05-16T10:42:53.257 に答える
1
scala> val Names = """.*?([^\.]+)\.(?:com|net|org|info|coop|int|co\.uk|org\.uk|ac\.uk|uk|__and so on__)""".r
Names: scala.util.matching.Regex = .*?([^\.]+)\.(?:com|net|org|info|coop|int|co\.uk|org\.uk|ac\.uk|uk|__and so on__)

scala> val Names( primary ) = "www.google.com"
primary: String = google

変更点:

  • ? に注意してください。最初の .* の後 -- 貪欲な一致は e.com までずっと一致する可能性があるため、オフにしてください。
  • 追加 '。' 必要なグループと (com|net...) セクションの間。ドットがそこの境界であると予想します
  • (com|net...) セクションでキャプチャ グループを定義したくないので、(...) だけでなく (?:...) を使用します。
  • 末尾の $ を削除しました。それはおそらく無償でした。

幸運を!

于 2013-05-16T10:40:58.810 に答える