まだちょっと試行錯誤しなきゃいけないと思いますが、とりあえずIPアドレスをチェックする方法。
import java.net.{InetAddress,UnknownHostException}
import util.parsing.combinator.RegexParsers
object IpParsers extends RegexParsers {
def ipAddress: Parser[String] = """[0-9a-fA-F:\.]+""".r.withFilter { str =>
try {
val addr = InetAddress.getByName(str)
true
} catch {
case e: UnknownHostException => false
}
}
}
- 前提として、IPv4またはIPv6文字列をまとめて扱い、ざっくりと文字列の範囲を選びとる。(最初の正規表現マッチ)
-
withFilter
で抽出した文字列の検証を追加 -
InetAddress.getByName
でIPアドレスとみなせるかどうかフィルタ
結果は見つかった文字列(ex. 192.168.0.0
, ::1
)になる。
Parser
クラスにwithFilter
やflatMap
などのMonadicなメソッドが定義されてるのは知らなかった。
余談
Scala 2.10 なら Try
が使えますね。エラー処理はこう書いたほうがすっきりするかも。
util.Try(InetAddress.getByName(str)).isSuccess
この場合、例外は全て握りつぶしてfalse
を返す仕様。