用字符串括起来的正则表达式模式?

时间:2019-01-17 03:54:55

标签: ruby regex

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

[
    [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",
]

2 个答案:

答案 0 :(得分:0)

您可以使用

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

请参见Ruby demoRubular demo

详细信息

  • ^-行首
  • #(?!#)-一个#之后没有另一个#
  • (?:(?!```)[^#]|```.*?```)*-重复0次或更多次
    • (?!```)[^#]-除#以外的其他任何未开始```字符序列的字符
    • |-或
    • ```-三个反引号
    • .*?-任意0个以上的字符,尽可能少
    • ```-三个反引号

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

答案 1 :(得分:0)

在这种情况下,我要做的可能并不完全是标准的,但是您在这里:

  1. 将字符串用三引号引起来:

    .split('```')
    
  2. 成对放入。第一部分是正常的降价促销,第二部分是代码段。

    .each_slice(2)
    
  3. 在第一部分而不是第二部分的#之前添加标记。请注意,在最后一个切片中,MD片为零。

    .map { |txt, code = nil| [txt.gsub('#', "\x00#"), code].compact }
    
  4. 重新加入

    .flatten.join('```')
    
  5. 被标记分割

    .split("\x00")
    

预计字节'0'不会出现在文本中,如果有的话,只需使用另一个标记,例如长随机字符串,而不会在生成时产生任何# 开始该过程。