我有以下脚本,该脚本输出如下所示的数组。
[
[0] "# bash LAN\n\n```\nnmap -sn 192.168.3.*\n```\n",
[1] "# node.js npm\n\n`sudo apt update && sudo apt install nodejs npm -y`\n",
[2] "# something title\n\nsomething content\n",
[3] "# bash log\n\n```\ntail -f",
[4] "# or",
[5] "# tail -f -n 50\n```\n\n\n"
]
Encoding.default_external = 'UTF-8'
require 'pry'
require "awesome_print"
# p \
ap \
arrayobj = <<-'EOS'.scan(/^#(?!#).*(?:\R(?!#(?!#)).*)*/) # .scan(/^#.*$\n(.*)/m)
# bash LAN
\```
nmap -sn 192.168.3.*
\```
# node.js npm
`sudo apt update && sudo apt install nodejs npm -y`
# something title
something content
# bash log
\```
tail -f
# or
# tail -f -n 50
\```
EOS
我想用#
(单个散列)分割EOS封闭的文本,但是如果Markdown代码标记包含单个散列,则忽略该单个散列。
因此,在那种情况下,我想要的是跟随输出。您如何获得输出?
[
[0] "# bash LAN\n\n```\nnmap -sn 192.168.3.*\n```\n",
[1] "# node.js npm\n\n`sudo apt update && sudo apt install nodejs npm -y`\n",
[2] "# something title\n\nsomething content\n",
[3] "# bash log\n\n```\ntail -f\n# or\n# tail -f -n 50\n```\n\n\n",
]
答案 0 :(得分:0)
您可以使用
.scan(/^#(?!#)(?:(?!```)[^#]|```.*?```)*/m).flatten
详细信息
^
-行首#(?!#)
-一个#
之后没有另一个#
(?:(?!```)[^#]|```.*?```)*
-重复0次或更多次
(?!```)[^#]
-除#
以外的其他任何未开始```
字符序列的字符|
-或```
-三个反引号.*?
-任意0个以上的字符,尽可能少```
-三个反引号 m
修饰符使.
与任何字符匹配,包括换行符。
答案 1 :(得分:0)
在这种情况下,我要做的可能并不完全是标准的,但是您在这里:
将字符串用三引号引起来:
.split('```')
成对放入。第一部分是正常的降价促销,第二部分是代码段。
.each_slice(2)
在第一部分而不是第二部分的#
之前添加标记。请注意,在最后一个切片中,MD片为零。
.map { |txt, code = nil| [txt.gsub('#', "\x00#"), code].compact }
重新加入
.flatten.join('```')
被标记分割
.split("\x00")
预计字节'0'不会出现在文本中,如果有的话,只需使用另一个标记,例如长随机字符串,而不会在生成时产生任何#
开始该过程。