当文本中存在多个标记时,如何将单个html标记与内部标记进行正则表达式匹配
假设我的文本如下所示:当文本中存在多个标记时,如何将单个html标记与内部标记进行正则表达式匹配,html,regex,visual-studio-code,Html,Regex,Visual Studio Code,假设我的文本如下所示: <button class="b1" (click)="b1()"> <mat-icon>icon</mat-icon> </button> <button class="b1" (click)="b1()"> <mat-icon>othericon</mat-icon> <span>Some Text</span> <
<button class="b1"
(click)="b1()">
<mat-icon>icon</mat-icon>
</button>
<button class="b1"
(click)="b1()">
<mat-icon>othericon</mat-icon>
<span>Some Text</span>
</button>
偶像
其他图标
一些文本
我正试图使用regex(基于Rust的,不带环顾的…,因为VSCode就是这样使用的)只选择包含跨距的按钮。我试过这个:
[\n\s\s]*?span[\n\s\s]*?
。。。但问题是,它从文件中第一个按钮的开始就匹配,即使它不包含跨距。我以为懒惰的量词会找到最短的匹配项,但它似乎不是这样工作的。有关示例,请参见我的RegExr。我希望它匹配多行,这就是[\n\s\s]
的原因
[\n\s\s]*?
。。。这样做可以很好地匹配单个标记。。。然而,让它与内部标签一起工作是我陷入困境的地方
谢谢 一般来说,应该避免使用正则表达式解析HTML。考虑到您是从IDE执行此操作,您可能没有任何选择。这里可以使用的一个技巧是使用调和点来避免解析结束标记:
<button[^>]*>((?!</button>)[\s\S])*<span>[\s\S]*?</button>
只要不遇到结束标记,这将使用负前瞻来匹配任何字符,一次一个。这可以防止模式在试图查找
时交叉标记。谢谢Tim,不幸的是Rust regex不支持前瞻。然而,我认为这可能是我真正想做的唯一选择。因此,我将使用不同的ide来完成您所提供的功能!干杯Joel@JoelDuckworth很高兴帮助你。听起来Rust regex有点生锈了,引擎可能需要升级。
((?!</button>)[\s\S])*