网站导航网学 原创论文 网站设计 最新系统 最新研究 原创论文 获取论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > 正则表达式 > 正文

正则应用之逆序环视探索.

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/06/29
不定长度量词的,在这个时候,匹配过程就变得复杂了。先看一下定长的是如何匹配的。
复制代码 代码如下:
string test = "<div>a test</div>";
Regex reg = new Regex(@"(?<=<div>)[^<]+(?=</div>)");
Match m = reg.Match(test);
if (m.Success)
{
richTextBox2.Text += m.Value + "\n";
}
/*--------输出--------
a test
*/

从结果可以看到,.NET中的逆序环视在子表达式长度固定时,匹配行为与Java中应该是一样的。那么不定长量词又如何呢?
复制代码 代码如下:
string test = "cba";
Regex reg = new Regex(@"(?<=(c?b))a");
Match m = reg.Match(test);
if (m.Success)
{
richTextBox2.Text += m.Value + "\n";
richTextBox2.Text += m.Groups.Value + "\n";
}
/*--------输出--------
a
cb
*/

可以看到,这里的“?”具备了贪婪模式的特性。那么这个时候是否会有这样的疑问,它的匹配过程仍然是从当前位置向左尝试,还是从字符串开始位置向右尝试匹配呢?
复制代码 代码如下:
string test = "<ddd<cccba";
Regex reg = new Regex(@"(?<=(<.*?b))a");
Match m = reg.Match(test);
if (m.Success)
{
richTextBox2.Text += m.Value + "\n";
richTextBox2.Text += m.Groups.Value + "\n";
}
/*--------输出--------
a
<cccb
*/

从结果可看出,在逆序环视中有不定量词的时候,仍然是从当前位置,向左尝试匹配的,否则Groups的内容就是“<ddd<cccb”,而不是“<cccb”了。
这是非贪婪模式的匹配情况,再看一下贪婪模式匹配的情况。
复制代码 代码如下:
string test = "e<ddd<cccba";
Regex reg = new Regex(@"(?<=(<.*b))a");
Match m = reg.Match(test);
if (m.Success)
{
richTextBox2.Text += m.Value + "\n";
richTextBox2.Text += m.Groups.Value + "\n";
}
/*--------输出--------
a
<ddd<cccb
*/

可以看到,采用贪婪模式以后,虽然尝试到“c”前面的“<”时已经可以匹配成功,但由于是贪婪模式,还是要继续尝试匹配的。直到尝试到开始位置,取最长的成功匹配作为匹配结果。
2.2 匹配过程
再来理一下逆序环视的匹配过程吧。
源字符串:<div id=“test1”>a test</div>
正则表达式:(?<=<div[^>]*>)[^<]+(?=</div>)


首先由“(?<=<div[^>]*>)”取得控制权,由位置0开始尝匹配,由于“<div[^>]*>”的长度不固定,所以会从当前位置向左逐字符查找,当然,也有可能正则引擎做了优化,先计算一下最小长度后向前查找,在这里“<div[^>]*>”至少需要5个字符,所以由当前位置向左查找5个字符,才开始尝试匹配,这要看各语言的正则引擎如何实现了,我推测是先计算最小长度。但是由于此时位于位置0处,前面没有任何字符,所以尝试匹配失败。

正则引擎传动装置向右传动,由位置1处开始尝试匹配,同样匹配失败,直到位置5处,向左查找5个字符,满足条件,此时把控制权交给“(?<=<div[^>]*>)”中的子表达式“<div[^>]*>”。“<div[^>]*>”取得控制权后,由位置0处开始向右尝试匹配,由于正则都是逐字符进行匹配的,所以这时会把控制权交给“<div[^>]*>”中的“<”,由“<”尝试字符串中的“<”,匹配成功,接下来由“d”尝试字符串中的“d”,匹配成功,同样的过程,由“<div[^>]*”匹配位置0到位置5之间的“<div ”成功,其中“[^>]*”在匹配“<div ”中的空格时是要记录可供回溯的状态的,此时控制权交给“>”,由于已没有任何字符可供匹配,所以“>”匹配失败,此时进行回溯,由“[^>]*”让出已匹配的空

网学推荐

  • ·【推荐参考】最新可过维普检测低于30%
  • ·【推荐】原创参考论文 原创资料
  • ·【推荐】原创参考论文导航
  • ·咨询参考QQ:3710167
  • ·咨询参考微信号:yclw90
  • ·扫一扫 加微信 咨询
  • ·我们提供原创参考论文和原创的参考资料!
  • ·很多朋友如果想要查重指导等,请沟通我们!
  • ·原创的论文资料参考省时间!
  • ·论文格式排版可以找我们!
  • ·论文答辩PPT格式排版定制!
  • ·程序和网站等UI设计定制!
  • ·程序设计定制!
  • ·网站设计定制!
  • ·UI设计定制!
  • ·程序和网站等UI设计定制!
  • ·原创参考论文参考定制!
  • 免费论文

    原创论文

    设为首页 | 加入收藏 | 论文首页 |原创论文 |
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师