RegEx:如何从$ N中排除匹配的组?

时间:2012-04-01 10:00:57

标签: javascript regex regex-group

我做了一个正常工作的正则表达式,但我认为这不是最好的用例:

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>

谷歌搜索后我发现{regexps中的(?: ... ) - 意味着忽略组匹配,因此:

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

但我需要第一个例子的期待结果。

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

这只是了解如何在regexp中排除组的一个小例子。我知道we can't parse HTML with regexp:)

2 个答案:

答案 0 :(得分:3)

所以你想在仅使用替换<b>$1</b>

时获得相同的结果

在你的情况下,只需replace(/\d+/, '<b>$&</b>')即可。

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

<div[^>]*>\K\d+(?=</div>)

答案 1 :(得分: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标签内的数字。