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

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

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/06/29
些情况不得不拆分成多个正则来实现。

而另一些流行的语言,比如Java中,虽然支持逆序环视,但只支持固定长度的子表达式,量词也只支持“?”,其它不定长度的量词如“*”、“+” 、“{m,n}”等是不支持的。

源字符串:<div>a test</div>
需求:取得div标签的内容,不包括div标签本身
Java代码实现:
复制代码 代码如下:
import java.util.regex.*;
String test = "<div>a test</div>";
String reg = "(?<=<div>)[^<]+(?=</div>)";
Matcher m = Pattern.compile(reg).matcher(test);
while(m.find())
{
System.out.println(m.group());
}
/*--------输出--------
a test
*/

但是如果源字符串变一下,加个属性变成“<div id=”test1”>a test</div>”,那么除非标签中属性内容是固定的,否则就无法在Java中用逆序环视来实现了。

为什么在很多流行语言中,要么不支持逆序环视,要么只支持固定长度的子表式呢?先来分析一下逆序环视的匹配原理吧。

2.1.2 Java中逆序环视匹配原理分析

不支持逆序环视的自不必说,只支持固定长度子表达式的逆序环视如何呢。
源字符串:<div>a test</div>
正则表达式:(?<=<div>)[^<]+(?=</div>)

需要明确的一点,无论是什么样的正则表达式,都是要从字符串的位置0处开始尝试匹配的。
首先由“(?<=<div>)”取得控制权,由位置0开始尝匹配,由于“<div>”的长度固定为5,所以会从当前位置向左查找5个字符,但是由于此时位于位置0处,前面没有任何字符,所以尝试匹配失败。
正则引擎传动装置向右传动,由位置1处开始尝试匹配,同样匹配失败,直到位置5处,向左查找5个字符,满足条件,此时把控制权交给“(?<=<div>)”中的子表达式“<div>”。“<div>”取得控制权后,由位置0处开始向右尝试匹配,由于正则都是逐字符进行匹配的,所以这时会把控制权交给“<div>”中的“<”,由“<”尝试字符串中的“<”,匹配成功,接下来由“d”尝试字符串中的“d”,匹配成功,同样的过程,由“<div>”匹配位置0到位置5之间的“<div>”成功,此时“(?<=<div>)”匹配成功,匹配成功的位置是位置5。
后续的匹配过程请参考 正则基础之——环视 和 正则基础之——NFA引擎匹配原理。
那么对于量词“?”又是怎么样一种情况呢,看一下下面的例子。
源字符串:cba
正则表达式:(?<=(c?b))a
复制代码 代码如下:
String test = "cba";
String reg = "(?<=(c?b))a";
Matcher m = Pattern.compile(reg).matcher(test);
while(m.find())
{
System.out.println(m.group());
System.out.println(m.group(1));
}
/*--------输出--------
a

*/

可以看到,“c?”并没有参与匹配,在这里,“?”并不具备贪婪模式的作用,“?”只提供了一个分支的作用,共记录了两个分支,一个分支需要从当前位置向前查找一个字符,另一个分支需要从当前位置向前查找两个字符。正则引擎从当前位置,尝试这两种情况,优先尝试的是需要向前查找较少字符的分支,匹配成功,则不再尝试另一个分支,只有这一分支匹配失败时,才会去尝试另一个分支。
复制代码 代码如下:
String test = "dcba";
String reg = "(?<=(dc?b))a";
Matcher m = Pattern.compile(reg).matcher(test);
while(m.find())
{
System.out.println(m.group());
System.out.println(m.group(1));
}
/*--------输出--------
a
dcb
*/

虽然有两个分支,但向前查找的字符数可预知的,所以只支持“?”时并不复杂,但如果再支持其它不定长度量词,情况又如何呢?
2.1.3 .NET中逆序环视匹配原理
.NET的逆序环视中,是支持

网学推荐

  • ·【推荐参考】最新可过维普检测低于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号 常年法律顾问:王律师