首页 > 解决方案 > 由字符串包围的正则表达式模式?

问题描述

我有以下脚本,脚本输出如下所示的数组。

[
    [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

我想用#(single hash) 分割 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",
]

标签: rubyregex

解决方案


您可以使用

.scan(/^#(?!#)(?:(?!```)[^#]|```.*?```)*/m).flatten

请参阅Ruby 演示Rubular 演示

细节

  • ^- 一行的开始
  • #(?!#)- 一个#不跟随另一个#
  • (?:(?!```)[^#]|```.*?```)*- 0次或多次重复
    • (?!```)[^#]- 除此以外的任何字符#都不会开始```字符序列
    • |- 或者
    • ```- 三个反引号
    • .*?- 任何 0+ 个字符,尽可能少
    • ```- 三个反引号

m修饰符匹配任何字符,.包括换行字符。


推荐阅读