简体   繁体   English

正则表达式。 找到包含一些单词的段落

[英]Regex. Find paragraph containing some word

In text like this: 在这样的文字:

<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>

I have to find paragraphs (between p tags) that contain string "TEXT". 我必须找到包含字符串“TEXT”的段落(在p标签之间)。
I tried <p>.*?(TEXT).*?<\\/p> 试过 <p>.*?(TEXT).*?<\\/p>
and I tried <p>(?!<p>).*?(TEXT).*?<\\/p> 试过 <p>(?!<p>).*?(TEXT).*?<\\/p>

But it doesnt solve the problem. 但它并没有解决问题。

((?!<\\/p>).)*(TEXT) to make sure 'Text' in one <p></p> ((?!<\\/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)); 

The first one you wrote works for me when i try it in sublime text's search bar with regex activated. 当我在sublime文本的搜索栏中尝试激活正则表达式时,你写的第一个对我有用。

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

You just need to add start and end delimiter like (...) or {...} or /.../ or [...] So try it like this: 你只需要添加开始和结束分隔符,如(...)或{...}或/.../或[...]所以尝试这样:

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

I think without delimiters its just a pattern and with them it's a regular expression in javascript... Add "i" after it for case insensitive search 我认为没有分隔符它只是一个模式和它们在javascript中的正则表达式...在它之后添加“i”以进行不区分大小写的搜索

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

Since it is a string, (said by @Rajesh), just create a div element and appent to it. 因为它是一个字符串,(由@Rajesh说),只需创建一个div元素并添加它。

get All the p tags using querySelectorAll and then use forEach function. 使用querySelectorAll获取所有p标记,然后使用forEach函数。

Check the innerHTML for /TEXT/ and if found, push it into array. 检查/TEXT/innerHTML ,如果找到,将其推入数组。

In the below program, the array a contains the 2 matching tags 在下面的程序中,数组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); 

If you don't want the <p></p> tags, just push the textContent 如果您不想要<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); 

You can try something like this: 你可以尝试这样的事情:

  • Create a regex to get all groups 创建一个正则表达式以获取所有组
  • Loop over these regex to check for necessary search key and filter out the matches. 循环遍历这些正则表达式以检查必要的搜索关键字并过滤掉匹配项。

 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) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM