Шаблон регулярного выражения для строки? - PullRequest
0 голосов
/ 17 января 2019

У меня есть следующий скрипт, и скрипт выводит массив, как показано ниже.

[
    [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 голосов
/ 17 января 2019

То, что я бы сделал в этом случае, возможно, не совсем стандартно, но вот вы:

  1. Разделить строку на тройные кавычки:

    .split('```')
    
  2. Возьмите кусочки попарно. Первая часть - нормальная уценка, вторая - фрагмент кода.

    .each_slice(2)
    
  3. Добавьте маркеры перед # в первом фрагменте, а не во втором. Обратите внимание, что часть MD в последнем срезе равна нулю.

    .map { |txt, code = nil| [txt.gsub('#', "\x00#"), code].compact }
    
  4. Присоединиться

    .flatten.join('```')
    
  5. Разделить по маркеру

    .split("\x00")
    

Байт '0' не должен присутствовать в вашем тексте, если он у вас есть, просто используйте другой маркер, например длинную случайную строку без каких-либо #, которые вы генерируете при запуске процесса. .

0 голосов
/ 17 января 2019

Вы можете использовать

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

См. Демонстрационную версию Ruby и демонстрационную версию Rubular .

Подробнее

  • ^ - начало строки
  • #(?!#) - a # не сопровождается другим #
  • (?:(?!```)[^#]|```.*?```)* - 0 или более повторений
    • (?!```)[^#] - любой символ, кроме #, который не запускает последовательность символов ```
    • | - или
    • ``` - три метки
    • .*? - любые 0+ символов, как можно меньше
    • ``` - три бэкстика

Модификатор m заставляет . соответствовать любому символу, включая символы разрыва строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...