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行。
答案 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。