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\|.*?(?=\\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 回答