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

标签 java regex

有人可以告诉我为什么我的模式:<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 if 后面没有 0 or more repetition [</p>] 之一。那不是你想要的。如果要匹配不是 </p> 的序列,那么您可以使用像这样的负前瞻: - ((?!</p>).)* 。现在,这将首先检查以下序列是否不是 </p> ,然后它匹配下一个字符。

所以,你的正则表达式模式应该是:-

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

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

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

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

相关文章:

javascript - 用引号替换双引号

python - 正则表达式只匹配各种括号外的内容

html - CSS 选择器 : if div's class name contains AT LEAST one char

c# - 正则表达式捕获文件名中的第一个/最后一个词

java - 使用键盘快捷键重新排列 IntelliJ 中的方法参数

java - 页面对象模型中的 WebDriver 显式等待

尝试图像高度时出现 java.lang.ArrayIndexOutOfBoundsException 错误

JavaScript 正则表达式基础

linux - 错误 : Could not find or load main class

java - Intellij tomcat 本地运行配置——幕后发生了什么?