gpt4 book ai didi

除非包含在括号中,否则 Ruby 正则表达式先行在管道处拆分

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:07 26 4
gpt4 key购买 nike

我正在尝试解码以下字符串:

body = '{type:paragaph|class:red|content:[class:intro|body:This is the introduction paragraph.][body:This is the second paragraph.]}'
body << '{type:image|class:grid|content:[id:1|title:image1][id:2|title:image2][id:3|title:image3]}'

我需要字符串在管道处拆分,而不是在管道包含方括号的地方拆分,为此我想我需要按照此处所述执行前瞻:How to split string by ',' unless ',' is within brackets using Regex?

我的尝试(仍然在每个管道处 split ):

x = self.body.scan(/\{(.*?)\}/).map {|m| m[0].split(/ *\|(?!\]) */)}
->
[
["type:paragaph", "class:red", "content:[class:intro", "body:This is the introduction paragraph.][body:This is the second paragraph.]"]
["type:image", "class:grid", "content:[id:1", "title:image1][id:2", "title:image2][id:3", "title:image3]"]
]

期待:

   ->
[
["type:paragaph", "class:red", "content:[class:intro|body:This is the introduction paragraph.][body:This is the second paragraph.]"]
["type:image", "class:grid", "content:[id:1|title:image1][id:2|title:image2][id:3|title:image3]"]
]

有人知道这里需要的正则表达式吗?

是否可以匹配这个正则表达式?我似乎无法正确修改它Regular Expression to match underscores not surrounded by brackets?


我在这里修改了答案Split string in Ruby, ignoring contents of parentheses?得到:

 self.body.scan(/\{(.*?)\}/).map {|m| m[0].split(/\|\s*(?=[^\[\]]*(?:\[|$))/)}

似乎可以解决问题。尽管我确定是否存在任何不足。

最佳答案

处理具有相同语法的嵌套结构会让事情变得困难。

您可以尝试递归下降解析器(Google 快速搜索 https://github.com/Ragmaanir/grammy - 不确定是否有用)

就个人而言,我会选择一些非常骇人听闻的东西 - 一些 gsubs 将您的字符串转换为 JSON,然后使用 JSON 解析器进行解析:-)。不过,这也不是特别容易,但这里有:

require 'json'

b1 = body.gsub(/([^\[\|\]\:\}\{]+)/,'"\1"').gsub(':[',':[{').gsub('][','},{').gsub(']','}]').gsub('}{','},{').gsub('|',',')


JSON.parse('[' + b1 + ']')

这并不容易,因为字符串格式显然使用 [foo:bar][baz:bam] 来表示哈希数组。如果您有机会修改序列化格式以使其更容易,我会接受。

关于除非包含在括号中,否则 Ruby 正则表达式先行在管道处拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15727562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com