5

私のscalaバージョン2.7.7

より大きな文字列からメールアドレスを抽出しようとしています。文字列自体はフォーマットに従いません。私が持っているコード:

import scala.util.matching.Regex
import scala.util.matching._
val Reg = """\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
"yo my name is joe : joe@gmail.com" match {
    case Reg(e) => println("match: " + e)
    case _ => println("fail")
}

RegexはRegExBuilderを渡しますが、scalaは渡しません。また、正規表現なしでこれを行う別の方法がある場合は、それも問題ありません。ありがとう!

4

3 に答える 3

7

Alan Mooreが指摘した(?i)ように、大文字と小文字を区別しないように、パターンの先頭にを追加する必要があります。また、正規表現を使用すると、文字列全体と直接一致することに注意してください。より大きな文字列内で1つを検索する場合はfindFirstIn()、Regexの同様のメソッドの1つを呼び出すか使用できます。

val reg = """(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
reg findFirstIn "yo my name is joe : joe@gmail.com"  match {
    case Some(email) => println("match: " + email)
    case None => println("fail")
}
于 2010-05-17T02:37:21.883 に答える
3

大文字と小文字を区別しない検索を実行しようとしているようですが、どこにも指定していません。(?i)正規表現の先頭に追加してみてください:

"""(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
于 2010-05-17T00:43:17.740 に答える
1

ええと、RE以外でそれを行う方法はおそらくかなり厄介です。次のステップは、おそらくコンビネーターパーサーでしょう。多くのランダムな文字列解剖コードはさらに一般的であり、ほぼ確実にはるかに苦痛になります。部分的には、適切な戦術は、レコグナイザーがどれだけ完全であるか(そしてどれだけ厳格または寛大である必要があるか)によって異なります。たとえば、一般的な形式:Rudolf Reindeer <rudy.caribou@north_pole.rth>REでは受け入れられません(大文字と小文字の区別が緩和された後でも)。本格的なRFC2822アドレス解析は、REベースのアプローチではかなり困難です。

于 2010-05-17T02:53:30.307 に答える