0

正規表現を使用して、このような文字列から結果の配列を作成したい:

results|foofoofoo\nresults|barbarbarbar\nresults|googoogoo\ntimestamps||friday

これが私の正規表現です。Sublime Text の正規表現検索では機能しますが、Ruby では機能しません。

(results)\|.*?\\n(?=((results\|)|(timestamps\|\|)))

これは望ましい結果です。

1. results|foofoofoo
2. results|barbarbar
3. results|googoogoo

代わりに、私はこれらの奇妙なリターンを得ていますが、それを理解することはできません. 結果の行が選択されないのはなぜですか?

Match 1
1. results
2. results|
3. results|
4.  

Match 2
1. results
2. results|
3. results|
4.   

Match 3
1. results
2. timestamps||
3.  
4. timestamps||

正規表現を使用した実際のコードは次のとおりです。

#create new lines for each regex'd line body with that body set as the raw attribute
host_scan.raw.scan(/(?:results)\|.*?\\n(?=((?:results\|)|(?:timestamps\|\|)))/).each do |body|
  @lines << Line.new({:raw => body})
end
4

4 に答える 4

1

Kendall Freyがすでに述べたように、作成しているキャプチャグループが多すぎます。最初の文字通りの「results|」をグループ化する必要はなく、代替グループの要素を個々の非後方参照グループにグループ化する必要もありません。あなたがやろうとしているのはこの正規表現です:

/results\|.*?(?=\\n(?:results\||timestamps\|\|))/

または、その部分を繰り返してもかまわない場合は、\\nキャプチャされていないサブグループを廃止できます。

/results\|.*?(?=\\nresults\||\\ntimestamps\|\|)/

–どちらも、質問で指定された一致する値の配列を返します。

于 2012-05-25T23:16:12.193 に答える
0

グループの捕獲と関係があると思います。すべてを変更する(...)(?:...)、キャプチャ グループが削除されます。

于 2012-05-25T18:17:13.487 に答える
0

データを取得するためのはるかに複雑な方法である正規表現にジャンプするのではなく、split("\n").

text = "results|foofoofoo\nresults|barbarbarbar\nresults|googoogoo\ntimestamps||friday"
ary = text.split("\n")

aryは:

[
  "results|foofoofoo",
  "results|barbarbarbar",
  "results|googoogoo",
  "timestamps||friday"
]

それをスライスすると、次のものが得られます。

ary[0..2]
=> ["results|foofoofoo", "results|barbarbarbar", "results|googoogoo"]

編集:

文字列にはより多くの改行と複雑な文字があるというコメントに基づいています。

require 'awesome_print'

text = "results|foofoofoo\nmorefoo\nandevenmorefoo\nresults|barbarbarbar\nandmorebar\nandyetagainmorebar\nresults|googoogoo\ntimestamps||friday"
ap text.sub(/\|\|friday$/, '').split('results')[1..-1].map{ |l| 'results' << l }

どの出力:

[
  [0] "results|foofoofoo\nmorefoo\nandevenmorefoo\n",
  [1] "results|barbarbarbar\nandmorebar\nandyetagainmorebar\n",
  [2] "results|googoogoo\ntimestamps"
]
于 2012-05-25T19:14:59.450 に答える
0

答えは括弧の中にあることがわかりました。括弧で囲むと、末尾の区切り文字だけでなく、一致全体が返されました。

host_scan.raw.scan(/((?:results\|.*?\\n)(?=(?:results\|)|(?:timestamps\|\|)))/).each do |body|
      @lines << Line.new({:raw => body})
end
于 2012-05-29T13:46:38.217 に答える