【问题标题】:Ruby regular expression exclude multiple items with positive lookaheadRuby 正则表达式排除多个具有正面前瞻性的项目
【发布时间】:2019-10-28 22:08:34
【问题描述】:

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

所以我们可以匹配换行符 (\n) 后跟除换行符和 block-level elements 之外的任何内容,假设我们要匹配 emstrong,但不匹配 ulli 例如:

\nJuanito
\n<ul>\n    <li>List
\n    </li>
\n    <em>
\n <strong>\n  Fatas!

我目前有(Rubular 需要 \\n 才能获得 \n):

\\n(?=[^\\n])

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

  • \nJuanito
  • \n&lt;ul&gt;
  • \n &lt;li
  • \n &lt;/li&gt;
  • \n &lt;em&gt;
  • \n &lt;strong&gt;
  • \n Fatas!

但我只想:

  • \n\nJuanito
  • \n\n &lt;em&gt;
  • \n\n &lt;strong&gt;
  • \n\n Fatas

无法弄清楚如何添加我想要排除的事物列表,同时排除换行符。

也对不使用正向前瞻的解决方案感兴趣。

谢谢。

【问题讨论】:

  • 为什么不\\n(?!\\n)?此外,如果\n 之后必须有任何字符,则只需使用\\n(?!\\n).。或\\n(?=(?!\\n).)
  • 啊,是的,谢谢。但是我需要确保匹配的换行符后面没有块级元素,所以我可以做点什么。
  • \\n(?!\s*&lt;\/?li)?见regex101.com/r/VOnXIw/1。此外,你确定你有"\\n"s 而不是"\n"s?

标签: regex ruby


【解决方案1】:

您维护拒绝列表将它们合并为负前瞻:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多