您现在的位置是:网站首页> 编程资料编程资料
正则应用之 逆序环视探索 ._正则表达式_
2023-05-25
361人已围观
简介 正则应用之 逆序环视探索 ._正则表达式_
1 问题引出
前几天在CSDN论坛遇到这样一个问题。
我要通过正则分别取出下面 与 之间的字符串
1、在 与 之间的字符串是没法固定的,是随机自动生成的
2、其中 与 的数量也是没法固定的,也是随机自动生成的
** 这里是不固定的字符串1 **
** 这里是不固定的字符串2 **
** 这里是不固定的字符串3 **
有朋友给出这样的正则“(?<=)([\s\S]*?)(?=)”,看下匹配结果。
string test = @" ** 这里是不固定的字符串1 **
** 这里是不固定的字符串2 **
** 这里是不固定的字符串3 ** ";
MatchCollection mc = Regex.Matches(test, @"(?<=)([\s\S]*?)(?=)");
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n---------------\n";
}
/*--------输出--------
** 这里是不固定的字符串1 **
---------------
** 这里是不固定的字符串2 **
---------------
** 这里是不固定的字符串3 **
---------------
*/
为什么会是这样的结果,而不是我们期望的如下的结果呢?
/*--------输出--------
** 这里是不固定的字符串1 **
---------------
** 这里是不固定的字符串2 **
---------------
** 这里是不固定的字符串3 **
---------------
*/
这涉及到逆序环视的匹配原理,以及贪婪与非贪婪模式应用的一些细节,下面先针对逆序环视的匹配细节展开讨论,然后再回过头来看下这个问题。
2 逆序环视匹配原理
关于环视的一些基础讲解和基本匹配原理,在正则基础之——环视这篇博客里已有所介绍,只不过当时整理得比较匆忙,没有涉及更详细的匹配细节。这里仅针对逆序环视展开讨论。
逆序环视的基础知识在上面博文中已介绍过,这里简单引用一下。
对于逆序肯定环视(?<=Expression)来说,当子表达式Expression匹配成功时,(?<=Expression)匹配成功,并报告(?<=Expression)匹配当前位置成功。
对于逆序否定环视(?
2.1 逆序环视匹配行为分析
2.1.1 逆序环视支持现状
目前支持逆序环视
前几天在CSDN论坛遇到这样一个问题。
我要通过正则分别取出下面 与 之间的字符串
1、在 与 之间的字符串是没法固定的,是随机自动生成的
2、其中 与 的数量也是没法固定的,也是随机自动生成的
** 这里是不固定的字符串1 **
** 这里是不固定的字符串2 **
** 这里是不固定的字符串3 **
有朋友给出这样的正则“(?<=)([\s\S]*?)(?=)”,看下匹配结果。
复制代码 代码如下:
string test = @" ** 这里是不固定的字符串1 **
** 这里是不固定的字符串2 **
** 这里是不固定的字符串3 ** ";
MatchCollection mc = Regex.Matches(test, @"(?<=)([\s\S]*?)(?=)");
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n---------------\n";
}
/*--------输出--------
** 这里是不固定的字符串1 **
---------------
** 这里是不固定的字符串2 **
---------------
** 这里是不固定的字符串3 **
---------------
*/
为什么会是这样的结果,而不是我们期望的如下的结果呢?
/*--------输出--------
** 这里是不固定的字符串1 **
---------------
** 这里是不固定的字符串2 **
---------------
** 这里是不固定的字符串3 **
---------------
*/
这涉及到逆序环视的匹配原理,以及贪婪与非贪婪模式应用的一些细节,下面先针对逆序环视的匹配细节展开讨论,然后再回过头来看下这个问题。
2 逆序环视匹配原理
关于环视的一些基础讲解和基本匹配原理,在正则基础之——环视这篇博客里已有所介绍,只不过当时整理得比较匆忙,没有涉及更详细的匹配细节。这里仅针对逆序环视展开讨论。
逆序环视的基础知识在上面博文中已介绍过,这里简单引用一下。
表达式 | 说明 |
(?<=Expression) | 逆序肯定环视,表示所在位置左侧能够匹配Expression |
(? | 逆序否定环视,表示所在位置左侧不能匹配Expression |
对于逆序肯定环视(?<=Expression)来说,当子表达式Expression匹配成功时,(?<=Expression)匹配成功,并报告(?<=Expression)匹配当前位置成功。
对于逆序否定环视(?
2.1 逆序环视匹配行为分析
2.1.1 逆序环视支持现状
目前支持逆序环视
