2016-03-22 9 views
2

私はmatch ... case開梱文でpattern.findFirstMatchIn()で試合を行いますがないScalaの正規表現を持っている:Scalaの正規表現:のfindAllと試合の間に矛盾...場合

val pattern = "\"(\\d+?)\",\"(.*?)\",(.+)$".r 
val line = "\"1795\",\"title\",\"desc" 

println(pattern.findFirstMatchIn(line).isDefined) 

val pattern2Unpacking = line match { 
    case pattern(category_id, title, description) => 
    true 
    case _ => false 
} 

println(pattern2Unpacking) 

一致する行が"1795","title","desc

との欠如であります末尾の引用符は意図的です。

出力はtrueではなく、truefalseです。

私はthis answerthisを見ましたが、解決策を私の問題に関連付けることはできません。境界マッチャーを省略しても何も変わりません。

ここで何が問題になりますか?コメント

スポイラー以下

更新:を以下に報告された見かけのすごみの一部は、私のデータは、中に注意するものであるIDEで表示されていない文字が含まれているという事実によって説明されますこれらの状況。実際に何が起こっているかについての詳細な詳細については、受け入れられた回答を参照してください。

私のIntelliJのスクリーンショットです。上のコードは@WiktorStribiżewのリンクからのコピー貼りです。下のコードは私がこの投稿に基づいたものです。出力ウィンドウがスクリーンショットに含まれています。これはいたずらではなく、これは少し怖いです。

アップデート2

これはさらに良いです:http://ideone.com/KsIIc1

はありません、私どちらも偽のスクリーンショットも私がいたずらをするideone.comをハックでした。

enter image description here

+1

私はこのようなを見つけます'val line = "" "" 356 "、" 789 "、" title "、" bla "" "は、引用符をエスケープする必要があるため、' false'になります。 –

+0

くそー、エスケープされた引用符で動作します。問題は:引用符付きの行は、完全なコードを投稿するための私のおもちゃの例にすぎません。私の実際の問題は、CSVとより複雑な正規表現から来ている行であり、私は読みやすさのためにそれを捨てました。 – DCS

+0

それでも、元の行は 'pattern.findFirstMatchIn'で' true'を返しますか? – DCS

答えて

1

ここでの違いはfindFirstMatchInは、正規表現パターンを使用する方法である:matchバージョンをアンカー使用しながらパターンをアンカーとして、それはそれを使用しません。 referenceを読むと、findFirstメソッドはアンカーパターンを使用しないことがわかります。

元の文字列の末尾にU + 2028(LINE SEPARATOR)文字が含まれていて、パターン末尾に$のアンカーが含まれていると、findFirstは一致したのはなぜですか?もしあれば、入力の終わり

が、最終terminatorため:それは$は(\Z anchorに等しい)文字列の末尾文字列の末尾、または最後の改行で適切に一致させることができるからです

Scalaは正規表現を固定するとき、\zロジックを使用しているようだ、とだけ(それは^$を使用していますreference saysが)文字列の最後にマッチします。

だから、そこに問題を解決するには、2つの方法があります。

  • はどちらかあなたのパターン(demo)の先頭に(?s) DOTALL修飾子を追加します。
    val pattern = "(?s)\"(\\d+?)\",\"(.*?)\",(.+)$".r
  • または正規表現を定義する際に.unanchoredを使用パターン(demo):
    val pattern = "\"(\\d+?)\",\"(.*?)\",(.+)$".r.unanchored
関連する問題