3

我制作了一个有效的正则表达式,但我认为这不是最好的用例:

el = '<div style="color:red">123</div>';
el.replace(/(<div.*>)(\d+)(<\/div>)/g, '$1<b>$2</b>$3');
// expecting result: <div style="color:red"><b>123</b></div>

谷歌搜索后,我发现(?: ... )在正则表达式中 - 意味着忽略组匹配,因此:

el.replace(/(?:<div.*>)(\d+)(?:<\/div>)/g, '<b>$1</b>');
// returns <b>123</b>

但我需要第一个示例的预期结果。

有没有办法排除他们?只是为了写replace(/.../, '<b>$1</b>')

这只是了解如何在正则表达式中排除组的一个小例子。我知道我们不能用正则表达式解析 HTML :)

4

2 回答 2

3

所以你想在只使用替换的同时获得相同的结果<b>$1</b>吗?

在你的情况下replace(/\d+/, '<b>$&</b>')就足够了。

但是如果你想确保数字周围有 div 标签,你可以\K在下面的表达式中使用lookarounds和like。除了JS不支持lookbehind nor \K,所以你运气不好,你必须在JS中使用捕获组。

<div[^>]*>\K\d+(?=</div>)
于 2012-04-01T10:06:31.233 回答
0

的替换值没有任何问题'$1<b>$2</b>$3'。我只是将您的正则表达式更改为:

el = '<div style="color:red">123</div>';
el.replace(/(<div[^>]*>)(\d+)(<\/div>)/g, '$1<b>$2</b>$3');

更改它与第一个 div 匹配的方式会保持 div 标签的完全匹配,但要确保它匹配>第一个 div 标签关闭之前可能的最小值,而不是可能的最大值。

使用您的正则表达式,您将无法通过此输入字符串获得所需的内容:

el = '<div style="color:red">123</div><div style="color:red">456</div>';

使用类似的问题:

el.replace(/\d+/, '<b>$&</b>')

是不是这样的事情不能正常工作:

el = '<div style="margin-left: 10px">123</div>'

因为它会提取 div 标签内的数字。

于 2012-04-01T10:23:39.030 回答