如果使用正则表达式存在第三个单词,如何在两个单词之间获得多个输出?

时间:2016-11-16 07:26:13

标签: regex

String = I <am a insta good </boy>.Why,I <am a insta bad </boy>.Where,I <am a naughty </boy>.How,I <am a soft </toy>.Don't know,I <am a very good </boy>.Why so, I <am a very bad </boy>.That's why

我想要输出,其中insta介于这两个单词之间,如

<am a insta good </boy>
<am a insta bad </boy>

我尝试了/(<am)(.*)(<\/boy>)/g这个,但我得到了很多输出。不是我想要的就是那5行。

1 个答案:

答案 0 :(得分:1)

由于您希望获得两个字符串而不是之间的子字符串,其间有第三个子字符串,因此您唯一的1遍正则表达式解决方案是使用tempered greedy token。见these best practice guidelines

  

何时使用此技术
  假设我们的老板现在告诉我们,我们仍然希望匹配并包括compile 'com.jjoe64:graphview:4.2.1',但我们还需要避免单步执行{END}部分(如果存在)。从懒惰的星形版本开始,以确保我们匹配{MID}分隔符,然后我们可以调整点以确保它不会翻转{END}

  {MID}

{START}(?:(?!{MID}).)*?{END}

请参阅regex demo

注意我保持捕获组完好无损,随时只保留你需要的那些。

模式详情

  • /(<am)((?:(?!<am|<\/boy>|insta).)*insta.*?)(<\/boy>)/g - (<am) substring
  • <am - 与任何字符匹配的驯化贪婪令牌,但换行符(?:(?!<am|<\/boy>|insta).)*不会启动否定前瞻中定义的任何序列:.,{{1} }或<am
  • </boy> - insta子字符串
  • insta - 除了换行符之外的任何0 +字符
  • insta - .*? substring。