如何在javascript中使用lookahead实现负面lookbehead?

问题描述:

由于您无法在JavaScript中使用负向倒序,因此如何使用超前或其他JavaScript支持的方法来实现相同的正则表达式匹配?如何在javascript中使用lookahead实现负面lookbehead?

(?<!<\/strong>\n\s{4}|<\/strong>&nbsp;\n\s{4})<br>

我试图找到不受</strong></strong>&nbsp;后跟一个换行符等一系列空白字符的前导的<br>标签。

here's my code和一些示例文本进行测试。我使用pague来实现它,但我无法弄清楚如何使它在JavaScript中工作。

我已经尝试了其他例子,但我无法弄清楚如何根据我的需要实现这些解决方案。

+0

[你尝试不匹配,你打算使用它的语言(https://regex101.com/r/ZactBT/2)。 –

+0

是的,我在pcre之前创建它,然后才意识到我无法在js中使用相同的表达式。现在我试图将工作pcre代码转换为与js兼容的东西。 – selfagency

+0

你想替换br's吗? – KevBot

的非正则表达式的方法

解析HTML时,我宁愿将HTML转换为DocumentFragments。这使我可以使用常用的querySelector方法和JS函数来实现我的最终目标。

我用以下代码替换了3个br标签:<div>REPLACED</div>。另外,为了创建片段,我使用了npm包html-fragment

const html = `<p><strong>It was a weak bit.</strong>&nbsp; 
 
    <br>Because it&rsquo;s already been done. If he had been like, &ldquo;I don&rsquo;t know, do you want to go to the La Brea tar pits and scoop some tar out and give ourselves a facial and burn ourselves and then only be able to know each other?&rdquo; I would be like, &ldquo;Haa, what?! Okay.&rdquo; I mean, something new is going on here. He basically did the equivalent of like when guys do &ldquo;fat guy in a little coat,&rdquo; and they act like it&rsquo;s not a Chris Farley callback. It&rsquo;s like, this is a joke that&rsquo;s in our system, so you&rsquo;re a little bit unoriginal or even worse, you don&rsquo;t know you&rsquo;re unoriginal.&nbsp;</p> 
 
<p><strong>Does he know it&rsquo;s you?</strong>&nbsp; 
 
    <br>I do think he knew that I was a comedian named Jenny. So anyway, he&rsquo;s like, &ldquo;Let&rsquo;s go to the Renaissance fair,&rdquo; and I call my friends, and I&rsquo;m like, &ldquo;I&rsquo;m not going on this date.&rdquo; And they&rsquo;re like, &ldquo;Oh Jenny, come on, don&rsquo;t be so closed down, you need to get out there.&rdquo; I&rsquo;m like, &ldquo;UGH, fine.&rdquo; Then we have a series of text messages back and forth that I&rsquo;m just kind of like, <em>What is this? Is this what dating is like?</em> I was with my ex-husband for nine years, then I was in a very serious relationship that was passionate for a year, and I&rsquo;m like, I don&rsquo;t know, maybe I just don&rsquo;t know what&rsquo;s going on. And he&rsquo;s asking me these questions that I&rsquo;m like, What. The. Fuck. Why don&rsquo;t you just wait?</p> 
 
<p><strong>What is he asking you?</strong>&nbsp; 
 
    <br>Like, &ldquo;Where was the last place you flew on an airplane?&rdquo; And I&rsquo;m not a rude or cruel woman, but I was like, I don&rsquo;t... dude... just wait. Sit me down, I&rsquo;ll tell you anything, just wait. Just wait until Saturday.</p> 
 
<p><strong>Also, that&rsquo;s the kind of question that is like, &ldquo;I&rsquo;m gonna go on the internet and search random questions to ask someone.&rdquo;</strong>&nbsp; 
 
    <br>Yeah, it&rsquo;s not great. It&rsquo;s a real speed-dating question. I would love it in other circumstances if it was like a page in <em>Entertainment Weekly</em>, you know? So then I&rsquo;m like, &ldquo;I made us a reservation at this restaurant, will you meet me there?&rdquo; He&rsquo;s like, &ldquo;Yes, is it fancy?&rdquo; I&rsquo;m like, &ldquo;No,&rdquo; and he&rsquo;s like, &ldquo;Okay, should I wear something like this?&rdquo; And he sends me a picture of a knight&rsquo;s costume. Like from the Renaissance fair. At which point I&rsquo;m like what the fuck, dude? Because I didn&rsquo;t even jump on this riff in the first place. It&rsquo;s not like I was like, &ldquo;Yes, and I will wear my wench&#39;s costume and bring a cup of mead!&rdquo; I&rsquo;m just like... Heh?! What? Why are you doing this?</p> 
 
<p><strong>You didn&rsquo;t respond positively to the bit.</strong> 
 
    <br>Never. Anyway, on the day of the date, I was like, &ldquo;How will I know it&rsquo;s you?&rdquo; And I thought he would be like, &ldquo;I&rsquo;m 6&rsquo;1&rdquo; and I&rsquo;ve got a beard,&rdquo; or some 
 
<p><br></p> 
 
<p><br></p> 
 
<p><br></p>`; 
 

 
const fragment = HtmlFragment(html); 
 
Array.from(fragment.querySelectorAll('br')) 
 
    .filter(br => { 
 
    let previous = br.previousElementSibling; 
 
    return (previous === null || previous.nodeName !== 'STRONG'); 
 
    }) 
 
    .forEach(br => { 
 
    let div = document.createElement('div'); 
 
    div.innerText = 'REPLACED'; 
 
    br.parentNode.replaceChild(div, br); 
 
    }); 
 

 
let div = document.createElement('div'); 
 
div.appendChild(fragment); 
 

 
console.log(div.innerHTML);
<script src="https://unpkg.com/[email protected]/lib/html-fragment.min.js"></script>

+0

如果我要去那条路线,那么我宁愿只使用jquery或cheerio '$('br')。each(function(){if(!$(this).siblings('strong' ))$(this).remove()})'@ – selfagency

+0

@ selfagency,所以是一般的想法,然后删除br标签是唯一的孩子标签? – KevBot

你必须匹配它才能通过它。
根本没有别的办法!

/(<\/strong>\n\s{4}|<\/strong>&nbsp;\n\s{4})?<br>/

在回调,如果组1不为空

https://regex101.com/r/xVJhGl/1

var text = 
 
"<p><strong>It was a weak bit.</strong>&nbsp;\n" 
 
+ " <br>Because it&rsquo;s already been done. If he had been like, &ldquo;I don&rsquo;t know, do you want to go to the La Brea tar pits and scoop some tar out and give ourselves a facial and burn ourselves and then only be able to know each other?&rdquo; I would be like, &ldquo;Haa, what?! Okay.&rdquo; I mean, something new is going on here. He basically did the equivalent of like when guys do &ldquo;fat guy in a little coat,&rdquo; and they act like it&rsquo;s not a Chris Farley callback. It&rsquo;s like, this is a joke that&rsquo;s in our system, so you&rsquo;re a little bit unoriginal or even worse, you don&rsquo;t know you&rsquo;re unoriginal.&nbsp;</p>\n" 
 
+ "<p><strong>Does he know it&rsquo;s you?</strong>&nbsp;\n" 
 
+ " <br>I do think he knew that I was a comedian named Jenny. So anyway, he&rsquo;s like, &ldquo;Let&rsquo;s go to the Renaissance fair,&rdquo; and I call my friends, and I&rsquo;m like, &ldquo;I&rsquo;m not going on this date.&rdquo; And they&rsquo;re like, &ldquo;Oh Jenny, come on, don&rsquo;t be so closed down, you need to get out there.&rdquo; I&rsquo;m like, &ldquo;UGH, fine.&rdquo; Then we have a series of text messages back and forth that I&rsquo;m just kind of like, <em>What is this? Is this what dating is like?</em> I was with my ex-husband for nine years, then I was in a very serious relationship that was passionate for a year, and I&rsquo;m like, I don&rsquo;t know, maybe I just don&rsquo;t know what&rsquo;s going on. And he&rsquo;s asking me these questions that I&rsquo;m like, What. The. Fuck. Why don&rsquo;t you just wait?</p>\n" 
 
+ "<p><strong>What is he asking you?</strong>&nbsp;\n" 
 
+ " <br>Like, &ldquo;Where was the last place you flew on an airplane?&rdquo; And I&rsquo;m not a rude or cruel woman, but I was like, I don&rsquo;t... dude... just wait. Sit me down, I&rsquo;ll tell you anything, just wait. Just wait until Saturday.</p>\n" 
 
+ "<p><strong>Also, that&rsquo;s the kind of question that is like, &ldquo;I&rsquo;m gonna go on the internet and search random questions to ask someone.&rdquo;</strong>&nbsp;\n" 
 
+ " <br>Yeah, it&rsquo;s not great. It&rsquo;s a real speed-dating question. I would love it in other circumstances if it was like a page in <em>Entertainment Weekly</em>, you know? So then I&rsquo;m like, &ldquo;I made us a reservation at this restaurant, will you meet me there?&rdquo; He&rsquo;s like, &ldquo;Yes, is it fancy?&rdquo; I&rsquo;m like, &ldquo;No,&rdquo; and he&rsquo;s like, &ldquo;Okay, should I wear something like this?&rdquo; And he sends me a picture of a knight&rsquo;s costume. Like from the Renaissance fair. At which point I&rsquo;m like what the fuck, dude? Because I didn&rsquo;t even jump on this riff in the first place. It&rsquo;s not like I was like, &ldquo;Yes, and I will wear my wench&#39;s costume and bring a cup of mead!&rdquo; I&rsquo;m just like... Heh?! What? Why are you doing this?</p>\n" 
 
+ "<p><strong>You didn&rsquo;t respond positively to the bit.</strong>\n" 
 
+ " <br>Never. Anyway, on the day of the date, I was like, &ldquo;How will I know it&rsquo;s you?&rdquo; And I thought he would be like, &ldquo;I&rsquo;m 6&rsquo;1&rdquo; and I&rsquo;ve got a beard,&rdquo; or some\n" 
 
+ "<p><br></p>\n" 
 
+ "<p><br></p>\n" 
 
+ "<p><br></p>\n" 
 
; 
 

 
var rx = /(<\/strong>\n\s{4}|<\/strong>&nbsp;\n\s{4})?<br>/g; 
 

 
text = text.replace(rx , function(match, a) 
 
    { 
 
     if (a) 
 
      return match; 
 
     return "<REPL>"; 
 
    } 
 
); 
 

 
console.log(text);

+0

谢谢。这也是我尝试在js vs. pcre中做到的最远的事情。我想这可能是我最好的选择,只需创建一个函数关闭.replace()忽略这种情况下,而不是试图在正则表达式中完成。 – selfagency

+0

@selfagency - 发布一个示例用法。 – sln