2013-11-23 8 views
9

正規表現を使って電話番号を処理し、(国コード)(市外局番)(番号)でグループ化する必要があります。入力フォーマット:スカラの正規表現を使ってグループ化とパターンマッチ

国コード:、市外局番 桁1-3間:1-3の間の桁 、数:

1 877 2638277 
91-011-23413627 

そして:4-10桁

例との間の私はこのようなグループをプリントアウトする必要があります。

CC=91,AC=011,Number=23413627 

これは私がこれまで持っているものです。

String s = readLine 
val pattern = """([0-9]{1,3})[ -]([0-9]{1,3})[ -]([0-9]{4,10})""".r 
val ret = pattern.findAllIn(s) 
println("CC=" + ret.group(1) + "AC=" + ret.group(2) + "Number=" + ret.group(3)); 

コンパイラは「空のイテレータ」と述べています。私も試しました:

val (cc,ac,n) = s 

それもうまくいきませんでした。これを修正するには?

+0

この分割を行うのは悪い考えです。たとえば、英国では、市外局番は5桁にすることができます。英国のWebサイトでは、もう一度別の市外局番を要求しますが、それはまったく意味がありません。 –

+0

これは、テストプログラムの入力フォーマットに過ぎません。なぜ正規表現パターンが "空のイテレータ"を返すのか、なぜval(cc、ac、n)= sが機能しないのかを知りたいだけです。実用的な解決策も役立ちます。 – user3025403

答えて

25

あなたのパターンに問題があります。私はそれらをテストするためにRegexPalのようないくつかのツールを使用することをお勧めします。最初のテキストボックスにパターンを置き、2番目のテキストボックスに例を示します。一致した部分が強調表示されます。

グループと[ -]セパレータの間にスペースを追加しましたが、そこにスペースが必要です。正しいパターンは次のとおりです。

val pattern = """([0-9]{1,3})[ -]([0-9]{1,3})[ -]([0-9]{4,10})""".r 

また、あなたが明示的にグループを取得したいならば、あなたはMatchが返さ取得したいです。

val allMatches = pattern.findAllMatchIn(s) 
allMatches.foreach { m => 
    println("CC=" + m.group(1) + "AC=" + m.group(2) + "Number=" + m.group(3)) 
} 

val matched = pattern.findFirstMatchIn(s) 
matched match { 
    case Some(m) => 
    println("CC=" + m.group(1) + "AC=" + m.group(2) + "Number=" + m.group(3)) 
    case None => 
    println("There wasn't a match!") 
} 

私はあなたにも、変数に文字列を抽出しようとした参照してください。たとえばfindFirstMatchIn機能は、オプションの第1 MatchまたはfindAllMatchInリターンマッチのリストを返します。あなたは次のようにRegex抽出器を使用する必要があります。また、あなたも理解し、あなたの文字列を容易にするためにstring interpolationを見てとることができ

s match { 
    case Pattern(cc, ac, n) => 
    println(s"CC=${cc}AC=${ac}Number=$n") 
    case _ => 
    println("No match!") 
} 

val Pattern = """([0-9]{1,3})[ -]([0-9]{1,3})[ -]([0-9]{4,10})""".r 
val Pattern(cc, ac, n) = s 
println(s"CC=${cc}AC=${ac}Number=$n") 

そして、あなたがエラーを処理する場合:s"..."

+0

ここにスペースを入れて明確にしましたが、明らかに私はそれをもっと混乱させました。私の実際のコードでは、[ - ]の前後にスペースを入れなかったが、それでも動作しなかった。 – user3025403

+0

@ user3025403私の答えは作業コードで更新されました。 –

+1

なぜ 'Pattern'が大文字であるのか不思議な人は、[Scala style guide](http://docs.scala-lang.org/style/naming-conventions.html#constants-values-variable-and -methods)定数は大文字で、この正規表現は定数でなければなりません。 –

関連する問題