0

所以,我仍然是一个 REGEX 假人,过去 2 天才使用它们。但是,至少对我来说,我的问题似乎很奇怪。

以下模式为我正确匹配此字符串:

<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|\r\n|\n)+<td>(([a-z]|[A-Z]|=|\\s)+)<br>

原始字符串(取自作为输入提供给正则表达式的 html 文档):

<td valign=3D"top">For:</td>     =             <td>XXXXXX XXXXX<br>

和匹配的字符串:

<td valign=3D"top">For:</td>     =             <td>XXXXXX XXXXX<br>

但是对于这个字符串:

<td valign=3D"top">For:</td>                     <td>YYYYYYY=     YYYYY<br>

它匹配整个 html 文档。我不明白为什么会这样,因为在我(([a-z]|[A-Z]|=|\\s)+指定应该有一个<br>标签之后

4

2 回答 2

2

为非贪婪匹配添加指示的问号:

<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|\r\n|\n)+?<td>(([a-z]|[A-Z]|=|\\s)+?)<br>
                                                    ^                         ^

编辑:

此外,您可以简化为字符类而不是使用交替:

<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|[\r\n])+?<td>([a-zA-Z=\\s]+?)<br>
                                           ^^^^^^        ^^^^^^^^^^^^

我唯一的问题是为什么你\\s的逃跑了,而你的\r\n却没有......

编辑2:

使用*代替+,例如,空格不是强制性的;在这些情况下,非贪婪量词可能总是有用的:

<td valign=3D\"top\">For:</td>(\\s)*?(=)?(.|[\r\n])*?<td>([a-zA-Z=\\s]*?)<br>
                                   ^^       ------ ^-     ------------^-
于 2012-07-11T13:44:04.257 回答
1

用正则表达式解析 HTML 是一个非常糟糕的主意。

在这里查看原因: RegEx 匹配开放标签,XHTML 自包含标签除外

即使在 HTML 中解析非常简单的东西,使用 DOM 解析器通常也更干净(更易读)并且更不容易出错。如果您是 REGEX 的新手,则更多

于 2012-07-11T13:43:47.023 回答