Ruby正则表达式排除前瞻性为正的多个项目

时间:2019-06-14 09:31:32

标签: regex ruby

我想在Ruby中使用正向超前(?=)时排除多个项目。

因此,我们可以匹配换行符(\n,后跟除换行符和block-level elements以外的任何内容,假设我们要匹配emstrong,但不匹配{{ 1}}和ul为例:

li

我目前有(\nJuanito \n<ul>\n <li>List \n </li> \n <em> \n <strong>\n Fatas! 的{​​{1}}需要\\n):

\n

将与所有换行符匹配,如下所示:

  • \\n(?=[^\\n])
  • \nJuanito
  • \n<ul>
  • \n <li
  • \n </li>
  • \n <em>
  • \n <strong>

但是我只想要:

  • \n Fatas!中的{li> \n
  • \nJuanito中的{li> \n
  • \n <em>中的{li> \n
  • \n <strong>中的{li> \n

无法弄清楚如何添加正要提前排除的事物列表以及排除换行符。

也对解决方案感兴趣,而无需使用积极的前瞻性。

谢谢。

1 个答案:

答案 0 :(得分:1)

您维护拒收清单,并以负前瞻的方式将它们合并:

rejects = Regexp.union %w[<ul </ul <li </li]
#⇒ /<ul|<\/ul|<li|<\/li/

input.scan(/\n(?!\n|\s*#{rejects})/)
#⇒ ["\n", "\n", "\n", "\n"]