【问题标题】:RegEx for excluding a match with prefix用于排除带有前缀的匹配项的正则表达式
【发布时间】:2021-01-07 08:17:57
【问题描述】:

我最初只想匹配第一个实例,但很快意识到这是不可能的。我使用的工具只使用 RegEx,所以我也没有选择。

基本上,我得到了一个带有 HTML 标签的文本,我想匹配第一段的标签而不匹配以下标签。 比如出这个:

<p>erkfoijwdocndoufhwroguh</p><p>pijgoijkuohuhogiougwtg</p><p>pijgoijkuohuhogiougwtg</p><p>pijgoijkuohuhogiougwtg</p>

我要匹配第一个<p></p> 没有别的了。 所以我想我可以使用负前瞻来排除旁边有标签的标签。如:

(?!>)(<|<\/)p>

但由于某种原因,这仍然匹配每个<p></p> 标签,而不是忽略那些前面有另一个标签的标签。有什么建议吗?

编辑添加:我只需要匹配标签,而不是标签内的文本。并且lookbehind不适用于我正在使用的工具。似乎所有工作 here 的东西也适用于我的工具。

第二次编辑:我解决了我的问题,但我没有解决这个问题,因为解决方案不是答案,这似乎是一个有趣的问题,我将来可能会遇到类似的问题。基本上,如果有人知道我如何引用前面没有> 但还包括第一个</p><p>,我想听听。

【问题讨论】:

  • (?s)(?<=^<p>).*?(?=</p>) 可能会。
  • 你需要使用lookbehind而不是lookahead
  • 正则表达式默认从左到右查找匹配。因此,您可以使用

    .*?

    并进行第一场比赛或使用 Match 选项而不是比赛(如果您使用的是 .net 风格)
  • (?s) 到底应该做什么?而且似乎我正在使用的工具无法识别后视,而只能识别前瞻。我也只需要匹配标签。不是里面的文字。

标签: regex regex-look-ahead


【解决方案1】:

我不确定我是否理解您想要实现的目标,是这样吗:

^<p>.*?<\/p>

在这里演示:https://regex101.com/r/ZXgMPV/1

【讨论】:

  • 这在大多数情况下确实有效。只是我不想匹配文本但我只想匹配标签而不是文本。
  • 如果您告诉我您正在使用什么工具/编程语言以及您想要实现的最终目标是什么,我可能会告诉您该怎么做,但不知道它会很复杂。例如,可变长度的lookbehinds 将允许一个简单的解决方案,但大多数情况下不受支持。那么你使用什么工具,你想用那些

    做什么?
  • 我正在使用 EasyCatalog(Adobe InDesign 的插件),它在调用它时纯粹使用 RegEx。由于您的回答,我确实解决了我的问题,尽管它没有准确回答我的问题。我最终做的只是添加括号,所以它看起来像这样:^(<p>).*?(</p>) 然后我只是调用了这些组。我想使用 EasyCatalog 的内置替换功能将第一个标签替换为 InDesign 样式的其他标签。它现在有效,但如果出现更准确的答案,我会保留问题!
  • 这正是我要建议的(你使用组),但我不确定你使用的工具是否允许你这样做。即使你得到了新的解决方案,我怀疑它们会比这个更简单,所以你可以放心地使用它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2019-09-26
  • 1970-01-01
  • 2022-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多