标签之间正则表达式匹配的文本太贪婪了

时间:2015-09-15 18:30:51

标签: javascript regex

我正在尝试从字符串中提取文本,并且在懒惰/贪婪方面遇到麻烦。

在示例中,我希望该文本与<b>I want this piece</b>匹配,因此我的正则表达式在<b></b>之间的任何内容都是非贪婪的,只要它包含&#39; piece& #39;

我的正则表达式的问题是匹配的文字包含<b>first</b>

var text = "<b>first</b> <b>I only want this piece</b>";
var regX = /<b>.*?piece.*?<\/b>/;
var matches = text.match(regX);

匹配文字

"<b>first</b> <b>I only want this piece</b>"

期望的比赛

"<b>I only want this piece</b>"

2 个答案:

答案 0 :(得分:3)

使用否定的char类而不是第一个.*?

var regX = /<b>[^<>]*?piece.*?<\/b>/;

<强>为什么吗

因为第一个<b>.*?piece将与第一个<b>匹配,并且它会一直持续到找到文本piece并且它不会关心中间存在的文本。如果您使用[^<>]*?,则会对匹配任何字符进行惰性匹配,但不会匹配<>字符的零次或多次。

答案 1 :(得分:1)

这可以用于排除任何html标签,并且可能会更加健壮,具体取决于您的字符串的可预测性:

var regX = /<b>(?:(?!<[^>]*>).)*piece.*?<\/b>/

如果要匹配换行符,除了点(。)之外,还可以使用\ s \ S,例如[.\s\S]

var regX = /<b>(?:(?!<[^>]*>)[.\s\S])*piece[.\s\S]*?<\/b>/