2017-04-24 14 views
3

は、私は私が定義された牽引正規表現パターンのいずれかと一致する文字列の一部を抽出したい:パターンマッチングエキス文字列スカラ

val matcher= (s:String) => s match {case pPat(el)=> println(el) // print the P.25.01.25 
             case rPat(el)=>println(el) // print R0100 
             case _ => println("no match")} 
:私は今のように要素を抽出するために私のメソッドを定義

//should match R0010, R0100,R0300 etc 
    val rPat="[R]{1}[0-9]{4}".r 
    // should match P.25.01.21 , P.27.03.25 etc 
    val pPat="[P]{1}[.]{1}[0-9]{2}[.]{1}[0-9]{2}[.]{1}[0-9]{2}".r 

そして、それをテストするなどして:私は、正規表現式が間違っているかはわからないけど

val pSt=" P.25.01.21 - Hello whats going on?" 
    matcher(pSt)//prints "no match" but should print P.25.01.21 
    val rSt= "R0010 test test 3,870" 
    matcher(rSt) //prints also "no match" but should print R0010 
    //check if regex is wrong 
    val pHead="P.25.01.21" 
    pHead.matches(pPat.toString)//returns true 
    val rHead="R0010" 
    rHead.matches(rPat.toString)//return true 

matchesメソッドの作品要素上に。だから、このアプローチの何が間違っていますか?

答えて

2

あなたは、文字列とのパターンマッチングを使用する場合は、あなたが心に留めする必要があること:あなたが合格.rパターンが全体にマッチする必要があります

  • 文字列でなければ、一致は返されません(パターンはとなります)
  • アンカーされていない場合は、不要なマッチを気にしてください:R[0-9]{4}matchブロック内CSR123456R1234(ソリューションは、あなたの本当の要件が何であるかに応じて異なるが、通常は単語の境界\bが十分であるか、あるいは負lookaroundsを使用することができます)
  • と一致しますが、正規表現マッチング機能があることをキャプチャグループが必要ですあなたが何らかの価値を取り戻したい場合は、pPat(el)rPat(el)elと定義します。パターンに、

    val pSt=" P.25.01.21 - Hello whats going on?" 
    matcher(pSt) // => P.25.01.21 
    val pSt2_bad=" CP.2334565.01124.212 - Hello whats going on?" 
    matcher(pSt2_bad) // => no match 
    val rSt= "R0010 test test 3,870" 
    matcher(rSt) // => R0010 
    val rSt2_bad = "CSR00105 test test 3,870" 
    matcher(rSt2_bad) // => no match 
    

    いくつかの注意事項を次に

    val rPat="""\b(R\d{4})\b""".r.unanchored 
    val pPat="""\b(P\.\d{2}\.\d{2}\.\d{2})\b""".r.unanchored 
    
    val matcher= (s:String) => s match {case pPat(el)=> println(el) // print the P.25.01.25 
        case rPat(el)=>println(el) // print R0100 
        case _ => println("no match") 
    } 
    

だから、私はfollowing solution示唆

  • \b - 大手ワード境界
  • (R\d{4}) - 正確に4桁の数字
  • \b一致キャプチャグループ - 末尾の単語境界

によりリテラル文字列を定義するために使用される三重引用符には、バックスラッシュをエスケープする必要はありません。

1

は、あなたのパターンのグループを紹介:

val rPat=".*([R]{1}[0-9]{4}).*".r 

val pPat=".*([P]{1}[.]{1}[0-9]{2}[.]{1}[0-9]{2}[.]{1}[0-9]{2}).*".r 

... 

scala> matcher(pSt) 
P.25.01.21 

scala> matcher(rSt) 
R0010 
+0

ありがとうございました! –

0

コードを次のように記述すると、目的の結果が生成されます。リファレンスAPIドキュメントは、その後、それはあなたのために働く場合は私に知らせてくださいhttp://www.scala-lang.org/api/2.12.1/scala/util/matching/Regex.html

//should match R0010, R0100,R0300 etc 
    val rPat="[R]{1}[0-9]{4}".r 
    // should match P.25.01.21 , P.27.03.25 etc 
    val pPat="[P]{1}[.]{1}[0-9]{2}[.]{1}[0-9]{2}[.]{1}[0-9]{2}".r 


    def main(args: Array[String]) { 
    val pSt=" P.25.01.21 - Hello whats going on?" 
    val pPatMatches = pPat.findAllIn(pSt); 
    pPatMatches.foreach(println) 
    val rSt= "R0010 test test 3,870" 
    val rPatMatches = rPat.findAllIn(rSt); 
    rPatMatches.foreach(println) 

    } 

です。

関連する問題