你可能会回应这个说H TML Parsing using regex is a totally bad idea ,例如this,你是对的 .
但在我的情况下,下面的html节点是由我们自己的服务器创建的,所以我们知道它总是这样,并且由于正则表达式将在_2789411中,我不想使用像Jsoup这样的库 .
What I want to parse : <img src="myurl.jpg" width="12" height="32">
What should be parsed :
-
匹配常规img标记,并将src属性值分组:
<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>
-
width和height属性值:
(width|height)\s*=\s*['"]([^'"]*)['"]*
因此,第一个正则表达式将具有带有img url的#1组,而第二个正则表达式将具有与其值的子组的两个匹配 .
How can I merge both?
期望的输出:
-
img url
-
宽度值
-
身高值
3 回答
如果你想把这两者结合起来就是答案 .
我测试的样品
试试这个
要将
img
标记与src
,height
和width
属性匹配,这些属性可以按任何顺序排列,并且实际上是可选的,您可以使用请参阅regex demo和IDEONE Java demo:
正则表达式详细信息:
(<img\\b|(?!^)\\G)
- 与<img>
标记开始匹配的初始边界或上一次成功匹配的结束[^>]*?
- 匹配我们不感兴趣的任何可选属性(除了>
之外的0个字符以便留在标签内) -\\b(src|width|height)=
- 整个单词src=
,width=
或height=
([\"']?)
- 检查属性值分隔符的技术第3组([^>]*?)
- 包含属性值的第4组(除了>
之外的0个字符,尽可能少于第一个\\3
- 属性值分隔符与组3匹配(如果分隔符可能为空,则为 NOTE ,在模式末尾添加(?=\\s|/?>)
)逻辑:
匹配
img
标记的开头然后,匹配内部的所有内容,但只捕获我们需要的属性
由于我们将要有多个匹配,而不是组,我们需要为每个新的
img
标记找到边界 . 这是通过检查第一组是否为空来完成的(if (!matcher.group(1).isEmpty())
)剩下要做的就是添加一个列表以保持匹配 .
你可能想要这个:
“(Ⅰ')(SRC |宽度|高度)= \” \ “”(*?)
Update:
我误解了你的问题,你需要这样的东西:
Regex101 Demo
Update 2
下面的正则表达式将以任何顺序捕获
img
标记属性:Regex101 Demo v2