正则表达式匹配由开始和结束词分隔的单词前后的多行

Regex match multiple lines before and after word delimited by start and end words

我想搜索 {{ upc }} 并且不是从比赛前的 <div 而是比赛前的第二个 <div 开始捕获,即 <div class="form-group"> 并且不捕获比赛后的第一个 </div>,而是捕获第二个,即结束 </div> 或直到下一个 <div class="form-group"> 的开始(取决于你如何看待它)

这是我要搜索和替换的示例 HTML/Twig 模板。

<div class="form-group">
    <label class="col-sm-2 control-label" for="input-sku"><span data-toggle="tooltip" title="{{ help_sku }}">{{ entry_sku }}</span></label>
    <div class="col-sm-10">
        <input type="text" name="sku" value="{{ sku }}" placeholder="{{ entry_sku }}" id="input-sku" class="form-control"/>
    </div>
</div>
<div class="form-group">
     <label class="col-sm-2 control-label" for="input-upc"><span data-toggle="tooltip" title="{{ help_upc }}">{{ entry_upc }}</span></label>
     <div class="col-sm-10">
         <input type="text" name="upc" value="{{ upc }}" placeholder="{{ entry_upc }}" id="input-upc" class="form-control"/>
     </div>
</div>
<div class="form-group">
     <label class="col-sm-2 control-label" for="input-ean"><span data-toggle="tooltip" title="{{ help_ean }}">{{ entry_ean }}</span></label>
     <div class="col-sm-10">
         <input type="text" name="ean" value="{{ ean }}" placeholder="{{ entry_ean }}" id="input-ean" class="form-control"/>
     </div>
</div>

预期的正则表达式匹配如下:

<div class="form-group">
     <label class="col-sm-2 control-label" for="input-upc"><span data-toggle="tooltip" title="{{ help_upc }}">{{ entry_upc }}</span></label>
     <div class="col-sm-10">
         <input type="text" name="upc" value="{{ upc }}" placeholder="{{ entry_upc }}" id="input-upc" class="form-control"/>
     </div>
</div>

感谢所有帮助。谢谢。

你需要解析你想要的 div,然后吸收其中的所有内容并排除其余部分。

[\w\W]表示匹配词和非词。例如,它匹配换行符,* 不匹配。

[\w\W]*(<div[\w\W]*?<div[\w\W]*?{{ sku }}[\w\W]*?<\/div>[\w\W]*?<\/div>)[\w\W]*

您可以尝试的一件事是使用否定前瞻来过滤掉您不希望包含在匹配中的内容。例如,匹配 <div,后跟任何内容,然后是另一个 <div,可以匹配 <div></div><div>.

之类的东西

相反,您可以说匹配 <div,然后是任何东西 - 只要它不是 </div> - 然后是另一个 <div.

<div    (?:(?!</div>).)*    <div

然后,您可以在表达式中通常写 .* 的任何位置插入相同的子模式。在这种特殊情况下,您可以重复该操作以确保您没有在 UPCthen 之前点击收盘 div 继续 {{ UPC }}部分。

<div(?:(?!</div>).)*<div    (?:(?!</div>).)*    {{ upc }}    .*?</div>\s*</div>

Here is a demo