gpt4 book ai didi

java - 在一行中匹配多个模式

转载 作者:行者123 更新时间:2023-11-30 06:26:15 27 4
gpt4 key购买 nike

有人可以告诉我为什么我的模式:<p(\s+(.*)?)?>(.[^</p>]*)?</p>无法正常工作。匹配示例:

  1. <p>This is a test and anything can be here even other <tags>tags</tags></p>
  2. <p style="test">This is a test</p>
  3. <p></p>

如果以上内容都在一行中,它应该会找到 3 个不同的模式。下面的链接演示了它非常奇怪的真实行为......

http://regexr.com?33jrn

它找到的匹配项应始终在找到 <p 时立即开始发现</p>立即停止

最佳答案

您的正则表达式存在一些问题。让我们看看它们长什么样。

这是你的正则表达式:-

<p(\s+(.*)?)?>(.[^</p>]*)?</p>
  • 问题 1:- 注意模式 (.*)? .它没有按照你的想法去做。这不是在 * 上强制执行不情愿的行为量词。相反,它是强制执行可选量词 (?)在贪婪*量词。它只是意味着匹配 0 or 1重复 (.*) .为了让它不情愿,你需要移动?括号内。所以,你需要使用 (.*?)而不是 (.*)? .
  • 问题 2:- [^</p>]不否定 </p>相反,它否定了 - <, /, p, >作为单独的字符。请注意,在字符类中,每个字符都是按字面意思获取的。那里没有分组。所以,(.[^</p>]*)表示匹配 character如果后面没有 0 or more repetition [</p>] 之一.那不是你想要的。如果你想匹配一个不是</p>的序列, 然后你可以像这样使用负面的前瞻: - ((?!</p>).)* .现在这将首先检查以下序列是否不是 </p> , 然后匹配下一个字符。

因此,您的正则表达式模式应该是:-

<p(\s+(.*?))?>((?!</p>).)*</p>

或者,您甚至可以将正则表达式简化为:-

<p[^>]*>((?!</p>).)*</p>

关于java - 在一行中匹配多个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14621214/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com