Regex 可选捕获组未捕获 姓名:内森 分机号码:222

Regex 可选捕获组未捕获 姓名:内森 分机号码:222,regex,parsing,Regex,Parsing,我有上面的HTML文本(无法更改),我想要一个返回3个捕获组的正则表达式,标签(名称|扩展名)字体颜色(黑色|红色)和数据(\w+) 我在返回捕获组2(字体颜色)时遇到一些问题。如您所见,它不在表的“Extension”行中,因此我将捕获组设置为可选。当我这样做的时候,第一行的数据根本不匹配。我尝试了很多不同量词组合的尝试和错误,但是我仍然不能得到我想要的结果 以下是我到目前为止的模式:(名称|扩展名):*?(?:)?*?>(\w+) 我相信*?正在使用可选的捕获组,并且只匹配第一组和第三组。如

我有上面的HTML文本(无法更改),我想要一个返回3个捕获组的正则表达式,标签
(名称|扩展名)
字体颜色
(黑色|红色)
和数据
(\w+)

我在返回捕获组2(字体颜色)时遇到一些问题。如您所见,它不在表的“Extension”行中,因此我将捕获组设置为可选。当我这样做的时候,第一行的数据根本不匹配。我尝试了很多不同量词组合的尝试和错误,但是我仍然不能得到我想要的结果

以下是我到目前为止的模式:
(名称|扩展名):*?(?:)?*?>(\w+)

我相信
*?
正在使用可选的捕获组,并且只匹配第一组和第三组。如果有人能向我解释我错在哪里,那就太好了


编辑:作为一个试图学习更多正则表达式的人,如果人们能够将我上面的数据解释为不可变的文本而不是HTML,我将不胜感激。

以下是您正在寻找的残暴:

<tr><td align=right>Name:</td><td align=left><b><font color=black>Nathan</font></b></td></tr>
<tr><td align=right>Extension:</td><td align=left><b>222</b></td></tr>

问题在于不情愿的量词。第一个
*?
一开始不消耗任何内容,允许正则表达式的下一部分在
之后尝试匹配字体标记。它找不到,但这没关系,因为那部分是可选的。然后第二个
*?
接管,只消耗它必须消耗的量,直到
(\w+)
可以匹配为止。因此,如果有一个字体标记,它将由第二个
*?
匹配,而不是由您想要的可选组匹配

但是不要让量词变得贪婪;它可能会起作用,但更有可能的是,它的失效效率会更低。请尝试以下方法:

 Name black Nathan
 Extension  222
 Name red Thomas
 Extension  223
 Name black Frank
 Extension  224
 Name red Steve
 Extension  225
 Name black Tony
 Extension  226

]*>(名称|扩展名):]*>(?:)([^不要使用正则表达式检查HTML。请使用类似@LuiggiMendoza的HTML解析器谢谢,非常好的链接,但不幸的是,我无法创造性地控制应用程序,添加新的依赖项是我无法做到的。必须有某种方法使用jsoup或其他解析器。最后要做的事情是创建自己的解析器,b但请相信我:如果你用正则表达式来做这件事,那将是一场地狱。@LuiggiMendoza我理解你的感受,但不幸的是,这不是我能控制的。让我们假设我只是想用正则表达式来完成这件事。我已经删除了java标记,希望这能让事情更清楚。这不是一种感受,而是demonstrated建议您应该使用解析器,而不是正则表达式:。如果您仍在研究如何使用正则表达式,我祝您好运并喝很多咖啡。谢谢Aaron,这太完美了。我同意我使用的源HTML非常糟糕(如果运气好的话,我也会这么认为)我也同意Luigi的观点,解析器会更好,但谢谢你回答我的问题。
[@Nathan:不,你没有。
[@Alanmore感谢你澄清了我对正则表达式中字符集的最初理解。虽然他的表达式确实有效,因此很有帮助,但我已经将你的答案标记为真实答案。感谢Alan,我感觉有些东西限制不够,导致我的字体标签被使用,但你已经向我解释了w在你的答案和Aaron的答案之间,我学到了更多关于正则表达式脆弱性的知识。
 <tr><td align=right>Name:</td><td align=left><b><font color=black>Nathan</font></b></td></tr>
 <tr><td align=right>Extension:</td><td align=left><b>222</b></td></tr>
 <tr><td align=right>Name:</td><td align=left><b><font color=red>Thomas</font></b></td></tr>
 <tr><td align=right>Extension:</td><td align=left><b>223</b></td></tr>
 <tr><td align=right>Name:</td><td align=left><b><font color=black>Frank</font></b></td></tr>
 <tr><td align=right>Extension:</td><td align=left><b>224</b></td></tr>
 <tr><td align=right>Name:</td><td align=left><b><font color=red>Steve</font></b></td></tr>
 <tr><td align=right>Extension:</td><td align=left><b>225</b></td></tr>
 <tr><td align=right>Name:</td><td align=left><b><font color=black>Tony</font></b></td></tr>
 <tr><td align=right>Extension:</td><td align=left><b>226</b></td></tr>
 Name black Nathan
 Extension  222
 Name red Thomas
 Extension  223
 Name black Frank
 Extension  224
 Name red Steve
 Extension  225
 Name black Tony
 Extension  226
<td[^>]*>(Name|Extension):</td><td[^>]*><b>(?:<font color=(black|red)>)?([^<]*)<