【问题标题】:RegEx match first occurrence before keyword正则表达式匹配关键字之前的第一次出现
【发布时间】:2016-03-17 09:19:59
【问题描述】:

我有以下字符串:

<ul><li><span>some words here.</span></li><li><span>other words here.</span></li><li><span>Code: 55555.</span></li></ul>

我的目标是从字符串中删除这部分,即包含“code”关键字的 li 标签集:

<li><span>Code: 55555.</span></li>

我正在尝试编写一个正则表达式来帮助我匹配和替换我的子字符串。 &lt;li&gt;&lt;/li&gt; 之间的文本可能会有所不同,但始终包含关键字“代码”。这是我到目前为止所拥有的:

<li>(.*)code:(.*?)<\/li>

问题是,它从第一个 &lt;li&gt; 标记开始匹配,我希望它从位于我们的关键字“代码”之前的 &lt;li&gt; 标记开始匹配。

感谢您的帮助!

【问题讨论】:

  • &lt;li&gt; 中是否可以嵌套 &lt;li&gt;&lt;span&gt;Code: 55555.&lt;/span&gt;&lt;/li&gt; 项?
  • 不,里面没有嵌套。

标签: regex replace match find-occurrences


【解决方案1】:

&lt;li&gt;(?:.(?!&lt;/li&gt;))+Code:(?:.*?)&lt;/li&gt;

  • 从字面上匹配&lt;li&gt;
  • 后跟文字 &lt;/li&gt; 不匹配的任意数量的字符(这样可以确保匹配只从相关的 &lt;li&gt; 开始)
  • 后跟文字Code:
  • 后跟任意数量的字符(非贪婪),直到匹配文字 &lt;/li&gt;

Demo

【讨论】:

    【解决方案2】:

    您可以为此尝试正则表达式组,因此您的正则表达式将是这样的:

    r'((.*)code:(.*?)){1,}'

    此正则表达式将匹配超过 1 次出现的字符串,其格式为 (.*)code:(.*?)。

    我想这可能会对你有所帮助。

    【讨论】:

      【解决方案3】:
      (.*)(<li>.*span.*<\/li>)(.*)
      

      Tim Biegeleisen 提供的 RegEx 运行良好。如果您想确保“代码”一词存在,只需将“跨度”替换为“代码”,例如:

      (.*)(<li>.*Code.*<\/li>)(.*)
      

      【讨论】:

        【解决方案4】:

      • [a-z|A-Z][Cc] 码:[0-9|.]+[a-z|A-Z]
      • 这里关键字“代码”在正则表达式中是强制性的

        【讨论】:

        • "
        • [a-z|A-Z]*[Cc]ode: [0-9|\.]+[a-z|A-Z]*
        • "
        猜你喜欢
        相关资源
        最近更新 更多
        热门标签