我想匹配以下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>
之间的最短字符串? (我发现了类似的问题,但无法找到解决方案。)
答案 0 :(得分:0)
使用“字符串开头”(^
)+“</tr>
以外的任何内容”((?:.(?!<\/tr>))*
)添加您的模式,以确保在您的模式之前没有出现</tr>
(以及因此,您的匹配是</tr>
之前的第一个匹配。应该使用一组来捕获原始模式:
^(?:.(?!<\/tr>))*((?:<td>).*?(?:<\/tr>))
答案 1 :(得分:0)
答案 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标记。