2017-04-12 2 views
2

文字列「winline」が1回以上現れることがあります。また、行に何回出現するかは事前に分かりません。複数の出現のための正規表現のキャプチャをグループに入れよう

このテキストに記載されているすべての「winline」をキャプチャする方法はありますか?私はGroovyを使用していて、winlineにマッチしてみましたが、全てをキャプチャしますが、それぞれがグループ1として記述されています。グループごとにグループをキャプチャできるようにしたいのです。

行を以下に、この正規表現を使用して実施例:winlineの\ "([0-9] +)

def matcher 
def winningSym = /winline\":([0-9]+)/ 

if((matcher = line =~ winningSym)){ 
    println matcher[0][1] // get 5 which is right 
    println matcher[1][1] // expect 4 but get IndexOutOfBounds Exception 
} 

ライン:

{" ID ":1、" winline ":5、" 賞金 ":50000、いくつかのランダムなテキスト、 "winline":4、 よりランダムなテキスト、 "winline":7、より多くのもの}

+0

**本当に**あなたが解析しなければならないテキストですか?誰かがJSON形式を見て、独自の解析不能なバリアントを書くことに決めましたか? –

+0

@tim_yatesはい、残念ながら、それは解析する必要があるテキストです。 – cubeb

答えて

1

あなたはわずか再修正することができ肯定後読みを使用し、シンプルなコードを使用するGEX:[5, 4, 7]

def winningSym = /(?<=winline":)[0-9]+/ 
String s = """{"Id":1,"winline":5,"Winnings":50000, some random text, "winline":4, more random text, "winline":7, more stuff}""" 
def res = s.findAll(winningSym) 
println(res) 

Groovy demo、出力を参照してください。

あなたの正規表現を使用し、(マッチャがiterator()方法をサポートしているとして、1つの)の値は、整合に.collectを使用するグループを収集するために:

​​3210

another Groovy demoを参照してください。ここでは、it[1]はキャプチャグループ1内のコンテンツにアクセスし、.collectはすべての一致を繰り返し処理します。

関連する問題