正则表达式。找到包含某个单词的段落

3

在这样的文本中:

<p>1 bla bla <em>bla</em> bla bla</p><p>2 bla bla <em>bla</em> bla TEXT bla</p><p>3 bla bla <em>bla</em> bla bla</p><p>4 bla bla <em>bla</em> bla TEXT bla</p><p>5 bla bla <em>bla</em> bla bla</p>

我必须找到包含字符串“TEXT”的段落(在p标签之间)。
尝试过<p>.*?(TEXT).*?<\/p>
和我尝试过<p>(?!<p>).*?(TEXT).*?<\/p>

但这并没有解决问题。

4个回答

3

((?!<\/p>).)*(TEXT) 是用来确保 'Text' 在一个 <p></p> 中的。

查看演示

var regex = /<p>((?!<\/p>).)*?(TEXT).*?<\/p>/g;
var text = '<p>1 bla bla <em>bla</em> bla bla</p><p>2 bla bla <em>bla</em> bla TEXT bla</p><p>3 bla bla <em>bla</em> bla bla</p><p>4 bla bla <em>bla</em> bla TEXT bla</p><p>5 bla bla <em>bla</em> bla bla</p>';
console.log(text.match(regex));


太好了!谢谢你! - Shimon S

0
有时候你只需要添加一个分隔符,比如(...)、{...}、/.../或[...]。所以可以像这样尝试:
/<p>.*?(TEXT).*?<\/p>/

但正如Barman所指出的那样,这并不总是局限于一个段落内。如果您真的只想选择一个段落,您需要像这样的东西:
(?:<p |<p>)(?:(?!\/p>).|\n)*(TEXT).*?<\/p>
  • (?:<p |<p>)<p <p> 开头,并且开头的?:表示“不要将其捕获到输出中”
  • (?:(?!\/p>).|\n)* 任何字符或换行符 .|\n,除了闭合标签/p>之外,并且开头的?:表示“不要将其捕获到输出中”
  • (TEXT) 当然是单词TEXT
  • .*? 懒惰匹配任意字符 .*? 直到最短匹配(在我们遇到</p>前)
  • <\/p> 必须以闭合标签</p>结尾

而且这可以允许多行文本!


这将匹配给定文本中的第一个段落(第一个段落不包含“TEXT”)。 - Shimon S
这不限制匹配到单个段落。 - Barmar
您说得完全正确,我已更新我的回答。 - Julesezaar

0

由于它是一个字符串,(由 @Rajesh 所说),只需创建一个 div 元素并将其添加到其中。

使用 querySelectorAll 获取所有的p标签,然后使用forEach函数。

检查innerHTML是否包含/TEXT/,如果找到,则将其推入数组中。

在下面的程序中,数组a包含2个匹配的标签。

var str="<p>1 bla bla <em>bla</em> bla bla</p><p>2 bla bla <em>bla</em> bla TEXT bla</p><p>3 bla bla <em>bla</em> bla bla</p><p>4 bla bla <em>bla</em> bla TEXT bla</p><p>5 bla bla <em>bla</em> bla bla</p>";
var div=document.createElement("div");
div.innerHTML=str;
var a=[];
div.querySelectorAll("p").forEach(x=>{if(/TEXT/.test(x.innerHTML)) a.push(x);});
console.log(a);

如果您不想要 <p></p> 标签,只需使用 textContent

var str="<p>1 bla bla <em>bla</em> bla bla</p><p>2 bla bla <em>bla</em> bla TEXT bla</p><p>3 bla bla <em>bla</em> bla bla</p><p>4 bla bla <em>bla</em> bla TEXT bla</p><p>5 bla bla <em>bla</em> bla bla</p>";
var div=document.createElement("div");
div.innerHTML=str;
var a=[];
div.querySelectorAll("p").forEach(x=>{if(/TEXT/.test(x.innerHTML)) a.push(x.textContent);});
console.log(a);


没有。有人也给我点了踩。@Rajesh 请检查一下,现在可以了吗? - Sagar V
我已经取消了我的投票,因为它可以产生正确的输出,但是OP正在寻找正则表达式。 - Rajesh
啊,是你啊。谢谢。我欣赏带有评论的踩。但我真的讨厌没有任何评论就踩的人。你的评论让我改进了我的回答。 - Sagar V
我认为这是OP的问题_我必须找到包含字符串“TEXT”的段落(在p标签之间)_@Rajesh - Sagar V
1
是的。正如所说,它产生了正确的输出,也很乐意以任何方式帮助。 :-) - Rajesh

-2
你可以尝试这样做:
  • 创建一个正则表达式来获取所有组
  • 循环遍历这些正则表达式,检查必要的搜索关键字并过滤出匹配项。

var str = "<p>1 bla bla <em>bla</em> bla bla</p><p>2 bla bla <em>bla</em> bla TEXT bla</p><p>3 bla bla <em>bla</em> bla bla</p><p>4 bla bla <em>bla</em> bla TEXT bla</p><p>5 bla bla <em>bla</em> bla bla</p>";

var groupRegex = /(?:^|<p>)(.*?)(?:<\/p>|$)/g;
var searchRegex = /text/i
var groups = str.match(groupRegex);

var result = groups.filter(function(s){ return searchRegex.test(s) })

console.log(result)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接