2017-12-20 2 views
0

ここに正規表現noob。スカラー正規表現のパスにパラメータを取得

パスの例:正規表現を使用して

home://Joseph/age=20/race=human/height=170/etc 

は、どのように私は/ etcジョセフ/パスと/の間に "=" の後に、すべてをつかむのですか?私はこれまでのところ、私は、パターンは私がちょうど「年齢= 20」を取得することができます

val pattern = ("""(?<=Joseph/)[^/]*""").r 
val matches = pattern.findAllIn(path) 

を持って

[20, human, 170] 

ようなリストを作成しようとしているが、私はfindAllInは私のすべてを見つけてみましょうと思いました」パラメータ= "は一致します。その後、正規表現を使って "年齢= 20"などで "20"を取得する方法がわかりません。

答えて

0

パターンはJoseph/の直後にパターンを探します。そのためage=20が一致します、おそらくちょうど=を見て?

val s = "home://Joseph/age=20/race=human/height=170/etc" 
// s: String = home://Joseph/age=20/race=human/height=170/etc 

val pattern = "(?<==)[^/]*".r 
// pattern: scala.util.matching.Regex = (?<==)[^/]* 

pattern.findAllIn(s).toList 
// res3: List[String] = List(20, human, 170) 
1

コード

See regex in use here

(?:(?<=/Joseph/)|\G(?!\A)/)[^=]+=([^=/]+) 

使用

See code in use here

object Main extends App { 
    val path = "home://Joseph/age=20/race=human/height=170/etc" 
    val pattern = ("""(?:(?<=/Joseph/)|\G(?!\A)/)[^=]+=([^=/]+)""").r 
    pattern.findAllIn(path).matchData foreach { 
     m => println(m.group(1)) 
    } 
} 

結果

入力

home://Joseph/age=20/race=human/height=170/etc 

出力

20 
human 
170 

を、以下の説明

  • (?:(?<=/Joseph/)|\G(?!\A)/)マッチ先立つものを確保
    • (?<=/Joseph/)正の後読みは=
    • 除いて、前の試合と文字通り一致/
  • [^=]+マッチ1以上の任意の文字の最後に/Joseph/文字通り
  • \G(?!\A)/アサート位置と一致しました=これに文字どおり一致する
  • ([^=/]+) 1つまたは複数のキャプチャグループ1に=および/を除くny文字
関連する問題