正则表达式 “双向最小匹配”

简介: 最近做一个 字符串查找的例子从字符串中提取制定内容

如下:



 String input = " <a  href=\" <a  href=\"authentication.html?file=KF619L_Z.pdf\" class=\"icondrawing balloonbtn\"  

  rel=\"shadowbox;width=720\">外観図面</a>";


需要提取   "authentication.html?file=KF619L_Z.pdf"


代码 如下:


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Text.RegularExpressions;

using System.Threading.Tasks;

namespace regDemo

{

   class Program

   {

       static void Main(string[] args)

       {

           String input = " <a  href=\" <a  href=\"authentication.html?file=KF619L_Z.pdf\" class=\"icondrawing balloonbtn\"  rel=\"shadowbox;width=720\">外観図面</a>";

           Console.WriteLine(getCenterString(input, "href=\"", "\" class="));

           Console.ReadKey();

       }

       public static String getCenterString(String input,String left,String right)

       {

           Match match = Regex.Match(input, left + "(.+?)" + right);

           while (match.Success)

           {

               return match.Groups[1].Value;

           }

           return "";  

       }

   }

}


中间加了 ?  目的是  非贪婪匹配。


但是效果并不理想,效果如下:

111.png

按照最小匹配原则,原则上我们应该得到理想结果,但是却没有。


这是因为在正则的解释器中,对于最小匹配原则的理解为正向最小匹配,


而不是双向最小匹配。


左侧匹配后 定住左侧边界   直到找到右侧为止






我们换个思路:


中间包含在我们左侧的字符即可,




我们对代码进行改进:



Match match = Regex.Match(input, left + "(((?!" + left + ").)+?)" + right);


得到了我们想要的结果:

222.png

补充:





【零宽断言】


正则表达四一些字符可以匹配一句话的开始、结束(^ $)或者匹配一个单词的开始、结束(\b)。这些元字符只匹配一个位置,指定这个位置满足一定的条件,而不是匹配某些字符,因此,它们被成为 零宽断言。所谓零宽,指的是它们不与任何字符相匹配,而匹配一个位置;所谓断言,指的是一个判断。正则表达式中只有当断言为真时才会继续进行匹配。


在有些时候,我们精确的匹配一个位置,而不仅仅是句子或者单词,这就需要我们自己写出断言来进行匹配。下面是断言的语法:

断言语法


说明


(?=pattern)


前向肯定断言,匹配pattern前面的位置


(?!pattern)


前向否定断言,匹配后面不是pattern的位置


(?<=pattern)


后向肯定断言,匹配pattern后面的位置


(?<!pattern)


后向否定断言,匹配前面不是pattern的位置



更多参考:http://www.cnblogs.com/youring2/archive/2009/11/07/1597786.html

————————————————

版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w605283073/article/details/48933895

相关文章
|
存储 JSON 监控
eBPF 深度探索: 高效 DNS 监控实现(下)
eBPF 深度探索: 高效 DNS 监控实现(下)
1098 0
|
3月前
|
机器学习/深度学习 缓存 监控
139_剪枝优化:稀疏模型压缩 - 分析结构化剪枝的独特速度提升与LLM部署加速实践
随着大语言模型(LLM)规模的不断增长,模型参数量已从最初的数亿扩展到数千亿甚至万亿级别。这种规模的模型在推理过程中面临着巨大的计算和内存挑战,即使在最先进的硬件上也难以高效部署。剪枝优化作为一种有效的模型压缩技术,通过移除冗余或不重要的参数,在保持模型性能的同时显著减少计算资源需求。
|
4月前
|
算法 调度 决策智能
【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)
【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)
152 7
|
Kubernetes Docker 微服务
构建高效的微服务架构:基于Docker和Kubernetes的最佳实践
在现代软件开发中,微服务架构因其灵活性和可扩展性而受到广泛青睐。本文探讨了如何利用Docker和Kubernetes来构建高效的微服务架构。我们将深入分析Docker容器的优势、Kubernetes的编排能力,以及它们如何结合实现高可用性、自动扩展和持续部署。通过具体的最佳实践和实际案例,读者将能够理解如何优化微服务的管理和部署过程,从而提高开发效率和系统稳定性。
|
SQL Oracle 关系型数据库
|
Ubuntu 应用服务中间件 Shell
acme.sh自动申请https证书
该文介绍了如何在Ubuntu 20.04系统上使用acme.sh获取和安装免费的HTTPS证书,适用于已经安装了nginx的环境。首先通过`sudo curl https://get.acme.sh | sh -s email=example@mail.com`安装acme.sh,然后使用`acme.sh --issue -d example.com -w /home/onestudy`生成证书,并用`acme.sh --install-cert`安装到nginx。设置定时任务以定期更新证书,并提供了不同方式的证书获取命令及删除和刷新证书有效性的方法。需确保已配置好域名解析和nginx配置。
1003 0
Visual Studio Code中按下CTRL + 右方向键
Visual Studio Code中按下CTRL + 右方向键
347 1
|
SQL 存储 Ubuntu
SQL Server On Linux 安装详解
SQL Server On Linux 安装详解
|
移动开发 JSON 前端开发
UniAPP nvue 与 vue 开发的常见区别
UniAPP nvue 与 vue 开发的常见区别
629 0

热门文章

最新文章