我正在尝试从字符串中提取文本,并且在懒惰/贪婪方面遇到麻烦。
在示例中,我希望该文本与<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>"
答案 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>/