regex - 如何使用正则表达式查看复杂模式?
问题描述
我在 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+)?)+?)+)
解决方案
你大量使用括号。此外,您在逗号之间捕捉单词的表达方式可能更简单。用非捕获组替换您的组,您将使用此正则表达式在您的第一个(也是唯一的)组中获得预期的匹配:
(?<=<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
(一个接一个的组,中间没有之前匹配的字符串)