在HTML中查找最短的正则表达式匹配

时间:2017-05-16 08:38:57

标签: html regex

我想匹配以下HTML中第一行的最后一列:  (这只是一个例子)

<tr> <td> ABC </td> <td> DEF </td> <td> ABC </td> </tr> 
<tr> <td> GHI </td> <td> JKL </td> <td> GHI </td> </tr>

所以我想要匹配的是:<td> ABC </td> </tr>

我尝试使用regex101.com,但我找不到合适的方法来匹配第一行的最后<td>

到目前为止我得到的是以下正则表达式:(<td>).*?(<\/tr>)匹配

<td> ABC </td> <td> DEF >/td> <td> ABC </td> </tr>虽然。

有没有办法只匹配<td></tr>之间的最短字符串? (我发现了类似的问题,但无法找到解决方案。)

5 个答案:

答案 0 :(得分:0)

使用“字符串开头”(^)+“</tr>以外的任何内容”((?:.(?!<\/tr>))*)添加您的模式,以确保在您的模式之前没有出现</tr>(以及因此,您的匹配是</tr>之前的第一个匹配。应该使用一组来捕获原始模式:

^(?:.(?!<\/tr>))*((?:<td>).*?(?:<\/tr>))

演示:https://regex101.com/r/enGASL/1

答案 1 :(得分:0)

我会用它来将所需的文本匹配到一个组中:

.*(<td>.+<\/td>?.+<\/tr>)

Here is the Regex demo

答案 2 :(得分:0)

正则表达式1是11个字符,

<td.{14}tr>

正则表达式2是30个字符,但它将涵盖任何数量的内容,

<td>\s*\w*?\s*<\/td>\s*<\/tr>

但真正的问题是你只想要一个匹配,而这个正则表达式与大多数其他正则表达式匹配时,当字符串是一个多行HTML片段时会多次匹配。解决方案很简单:

  

没有全局标志 - 找到匹配后会停止

演示

/* Regex 1
|| Literal: <td
|| Any 14 char or space (no line terminators)
|| Literal: tr>
|| NO GLOBAL FLAG - Once a match is found it stops
*/
const rgx1 = /<td.{14}tr>/;
/* Regex 2
|| Literal: <td>
|| Zero or more spaces
|| Zero or more word characters lazily collect until 
|| Zero or more spaces
|| Literal: <\td>
|| Zero or more spaces
|| Literal: </tr>
*/
const rgx2 = /<td>\s*\w*?\s*<\/td>\s*<\/tr>/
const str = `<tr> <td> ABC </td> <td> DEF </td> <td> ABC </td> </tr> 
<tr> <td> GHI </td> <td> JKL </td> <td> GHI </td> </tr>`;

let res1 = str.match(rgx1);
let res2 = str.match(rgx2);
console.log('Result 1: ' + res1);
console.log('Result 2: ' + res2);

顺便说一句,字符串中有一个拼写错误:DEF >/td>JKL >/td>

答案 3 :(得分:0)

console.log(
`<tr> <td> ABC </td> <td> DEF </td> <td> XCC </td> </tr> 
<tr> <td> GHI </td> <td> JKL </td> <td> GHI </td> </tr>`
.match(/\w+(?=[</> td]+r>)/)
)

答案 4 :(得分:0)

在编写正则表达式时尽可能精确。

(<td>)[^\<\>]*(<\/td>)\s*(<\/tr>)

这假设td标记的内容不包含html标记。