有人可以告诉我为什么我的模式:<p(\s+(.*)?)?>(.[^</p>]*)?</p>
无法正常工作。匹配示例:
<p>This is a test and anything can be here even other <tags>tags</tags></p>
<p style="test">This is a test</p>
<p></p>
如果以上内容都在一行上,那么它应该会找到 3 个独立的模式。下面的链接展示了它的真实行为,这非常奇怪......
当它找到<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/