Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当文本中存在多个标记时,如何将单个html标记与内部标记进行正则表达式匹配_Html_Regex_Visual Studio Code - Fatal编程技术网

当文本中存在多个标记时,如何将单个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])*