首页 > 解决方案 > 如何使用正则表达式查看复杂模式?

问题描述

我在 Sublime Text 中有以下 html 元素:

<div class="exg"><div><strong class="syn">investigate</strong><span class="syn">, conduct investigations into, make inquiries into, inquire into, probe, examine, explore, research, study, look into, go into</span></div>

我想使用正则表达式来选择该元素中包含第 5 个逗号之后的内容,在此之前停止 </span></div>。所以,在这种情况下,我想选择:

, examine, explore, research, study, look into, go into

到目前为止,我能够编写这个正则表达式,它有效:

(<div class="exg"><div><strong class="syn">(\w+)((\s)?(\w+)?)+</strong><span class="syn">((\,((\s)?(\w+)?)+)?){5})

这使我可以在需要选择之前选择零件。我试图以积极的方式使用它,但它不起作用,我不知道如何解决它。这是我尝试过的:

(?<=(<div class="exg"><div><strong class="syn">(\w+)((\s)?(\w+)?)+</strong><span class="syn">((\,((\s)?(\w+)?)+)?){3}))((\,?((\s)?(\w+)?)+?)+)

标签: regex

解决方案


你大量使用括号。此外,您在逗号之间捕捉单词的表达方式可能更简单。用非捕获组替换您的组,您将使用此正则表达式在您的第一个(也是唯一的)组中获得预期的匹配:

(?<=<div class="exg"><div><strong class="syn">)(?:\s?\w)*<\/strong><span class="syn">(?:,(?:\s?\w)*){4}(.*?)(?=<\/span><\/div>)

顺便说一句,如果您想捕获第 5 个逗号,我认为您的量词应该是{4}(但我可能误解了)

检查演示

更新:如果您要删除匹配的组(即用空字符串替换它)。只是做相反的事情:在之前和之后建立一组:

(<div class="exg"><div><strong class="syn">(?:\s?\w)*<\/strong><span class="syn">(?:,(?:\s?\w)*){4}).*?(<\/span><\/div>)

Demo
然后在你的编辑器中替换为\1\2(一个接一个的组,中间没有之前匹配的字符串)


推荐阅读