2016-07-08 4 views
1

私は構成ファイルから値を抽出するために1つのライナーを持っています。正規表現を2回適用する必要はありません(行を一致させるには1回、グループを取得するにはもう一度)。これを避ける方法は誰にもありますか?Scala正規表現を使用して1つのライナーとしてファイルから値を抽出する

例データTEMP.TXT

scalaVersion=2.11.5 
scalaXMLVersion=1.0.3 
jUnitVersion=4.8.2 
log4JVersion=1.2.17 

"ワン" ライナー

val cfg: File = new File("temp.txt") 
val regexp = """jUnitVersion=(.*)""" 
val version = Source.fromFile(cfg) 
        .getLines 
        .find(_.matches(regexp)) 
        .map(regexp.r.findFirstMatchIn(_).get.group(1)) 
        .getOrElse("NOTFOUND") 
println(version) 

出力

4.8.2 

答えて

1
val lines = Seq("scalaVersion=2.11.5", 
    "scalaXMLVersion=1.0.3", 
    "jUnitVersion=4.8.2", 
    "log4JVersion=1.2.17") 
val regexp = new scala.util.matching.Regex("""jUnitVersion=(.*)""") 
val version = lines. 
    flatMap(regexp.findFirstMatchIn(_)). 
    headOption. 
    fold("NOTFOUND")(_.group(1)) 

行の場合、Source.fromFile(cfg).getLinesに代入することができます。

これは、一致するすべての正規表現パターンを収集したファイルを読み取ります。そのような最初の一致をとり、バージョン番号コンポーネントを抽出します。行が一致しない場合は、折り返しの "NOTFOUND"ブランチが取得されます。

フィルタリングの代わりに一致を保持し、抽出(group(1))を最初に保持した一致に適用することで、重複しないようにします。

2

代替バージョンでは、抽出器として正規表現を使用して:

val cfg: java.io.File = new java.io.File("temp.txt") 
val regexp = """jUnitVersion=(.*)""".r 
val version = scala.io.Source.fromFile(cfg) 
    .getLines() 
    .collectFirst { case regexp(value) => value } 
    .getOrElse("NOTFOUND") 
+1

'collectFirst' – Dima

+0

@Dimaありがとう、ずっとよかった – Mikesname

1

標準プロパティファイルのようにあなたがルックスを解析しているファイルなので、正規表現をいじりする代わりに、Javaのを使用することであろうビルトインjava.util.Propertiesこれを解析する:

val cfg: InputStreamReader = Source.fromFile("temp.txt").reader() 
val properties: Properties = { val p = new Properties(); p.load(cfg); p } 
val version = properties.getProperty("jUnitVersion", "NOTFOUND") 
+2

+1。私は一度でも正規表現を適用することは喜んではいません - 正規表現は間違いなくその場所を持っている間、これはそのような状況の一つではありません。 – Dave

+0

あなたのアドバイスをありがとうが、私は可能な限りシンプルな例を保つためにプロパティスタイルのファイルを純粋に取った。さまざまなデータファイル(以前はperlを使っていた)でハッキングしていましたが、可能な限り簡潔にScalaの正規表現をどのように使用できるかに興味がありました。 – BarneyW

+0

@BarneyWわかりました。私は時には "最小限の再現可能な例"がちょっと小さすぎるかもしれないと思います;)私はこの単純なユースケースを実際に持つ将来の読者のためにここに残します。 –

関連する問題