regex 正则表达式,查找包含某个单词的段落

p8h8hvxi  于 2023-04-22  发布在  其他
关注(0)|答案(4)|浏览(139)

在这样的文本中:
<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标签之间)。
I tried<p>.*?(TEXT).*?<\/p>
和I tried<p>(?!<p>).*?(TEXT).*?<\/p>
但这并不能解决问题。

x9ybnkn6

x9ybnkn61#

((?!<\/p>).)*(TEXT)确保一个<p></p>中的“文本”
See demo

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));
5n0oy7gb

5n0oy7gb2#

由于它是一个字符串,(@Rajesh说),只需创建一个div元素并appent到它。
使用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);
ct3nt3jp

ct3nt3jp3#

有时你只需要添加一个分隔符,比如(...)或{...}或/.../或[...],所以像这样尝试:

/<p>.*?(TEXT).*?<\/p>/

但正如Barman所指出的,这并不总是停留在一个段落内。如果你真的只想选择一个段落,你需要这样的东西:

(?:<p |<p>)(?:(?!\/p>).|\n)*(TEXT).*?<\/p>
  • (?:<p |<p>)<p<p>开头,并且开头的?:表示“在输出中不捕获此内容”
  • (?:(?!\/p>).|\n)*任何字符或换行符.|\n,除了结尾的/p>和开头的?:表示“在输出中不捕获此内容”
  • (TEXT)当然是TEXT这个词
  • .*?任何带有惰性量词“?”的字符.*?在最短匹配时停止(在我们有</p>之前
  • <\/p>并且必须以关闭</p>标记结束

这一个也允许多行文本!

s6fujrry

s6fujrry4#

你可以试试这样的方法:

  • 创建正则表达式以获取所有组
  • 循环遍历这些正则表达式以检查必要的搜索关键字并筛选出匹配项。
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)

相关问题