Ruby扫描正则表达式

Rya*_*ing 4 ruby regex

我正在尝试拆分字符串:

"[test| blah] \n [foo |bar bar bar]\n[test| abc |123 | 456 789]"
Run Code Online (Sandbox Code Playgroud)

进入以下数组:

[
  ["test","blah"]
  ["foo","bar bar bar"]
  ["test","abc","123","456 789"]
]
Run Code Online (Sandbox Code Playgroud)

我尝试了以下,但它不太正确:

"[test| blah] \n [foo |bar bar bar]\n[test| abc |123 | 456 789]"
.scan(/\[(.*?)\s*\|\s*(.*?)\]/)
# =>
# [
#   ["test", "blah"]
#   ["foo", "bar bar bar"]
#   ["test", "abc |123 | 456 789"]
# ]
Run Code Online (Sandbox Code Playgroud)

我需要在每个管道而不是第一个管道上拆分.实现这一目标的正确正则表达式是什么?

mat*_*att 7

 s = "[test| blah] \n [foo |bar bar bar]\n[test| abc |123 | 456 789]"
 arr = s.scan(/\[(.*?)\]/).map {|m| m[0].split(/ *\| */)}
Run Code Online (Sandbox Code Playgroud)


Phr*_*ogz 6

两种选择:

s = "[test| blah] \n [foo |bar bar bar]\n[test| abc |123 | 456 789]"

s.split(/\s*\n\s*/).map{ |p| p.scan(/[^|\[\]]+/).map(&:strip) }
#=> [["test", "blah"], ["foo", "bar bar bar"], ["test", "abc", "123", "456 789"]]

irb> s.split(/\s*\n\s*/).map do |line|
  line.sub(/^\s*\[\s*/,'').sub(/\s*\]\s*$/,'').split(/\s*\|\s*/)
end
#=> [["test", "blah"], ["foo", "bar bar bar"], ["test", "abc", "123", "456 789"]]
Run Code Online (Sandbox Code Playgroud)

它们都是从分割新行开始(扔掉周围的空白).

第一个,然后通过分割寻找任何每个块不是一个[,|或]再扔掉多余的空格(主叫strip每).

然后第二个抛弃前导[和尾随](用空格)然后分裂|(用空格).


您无法通过单一获得所需的最终结果scan.你可以得到的最近的是:

s.scan /\[(?:([^|\]]+)\|)*([^|\]]+)\]/
#=> [["test", " blah"], ["foo ", "bar bar bar"], ["123 ", " 456 789"]]
Run Code Online (Sandbox Code Playgroud)

...丢弃信息,或者:

s.scan /\[((?:[^|\]]+\|)*[^|\]]+)\]/
#=> [["test| blah"], ["foo |bar bar bar"], ["test| abc |123 | 456 789"]]
Run Code Online (Sandbox Code Playgroud)

...将每个"数组"的内容捕获为单个捕获,或者:

s.scan /\[(?:([^|\]]+)\|)?(?:([^|\]]+)\|)?(?:([^|\]]+)\|)?([^|\]]+)\]/
#=> [["test", nil, nil, " blah"], ["foo ", nil, nil, "bar bar bar"], ["test", " abc ", "123 ", " 456 789"]]
Run Code Online (Sandbox Code Playgroud)

...最多硬编码为四个项目,并插入nil您需要的条目.compact.

没有办法使用Ruby scan来获取正则表达式,/(?:(aaa)b)+/并且每次重复匹配时都会获得多次捕获.