我正在尝试拆分字符串:
"[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)
我需要在每个管道而不是第一个管道上拆分.实现这一目标的正确正则表达式是什么?
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)
两种选择:
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)+/并且每次重复匹配时都会获得多次捕获.
| 归档时间: |
|
| 查看次数: |
4679 次 |
| 最近记录: |