本文实例讲述了正则表达式教程之位置匹配。分享给大家供大家参考,具体如下:

注:在所有例子中正则表达式匹配结果包含在源文本中的【和】之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明。所有java例子都在JDK1.6.0_13下测试通过。
一、问题引入
如果想匹配一段文本中的某个单词(暂不考虑多行模式,将在后面介绍),我们可能会像下面这样:
文本:Yesterday is history, tomorrow is a mystery, but today is a gift.
正则表达式:is
结果:Yesterday 【is】 h【is】tory, tomorrow 【is】 a mystery, but today 【is】 a gift.
分析:本来只是要匹配单词is,但把其他单词中包含的is也匹配出来了。要解决这个问题,使用边界界定符,也就是在正则表达式里用一些元字符来表明我们想让匹配操作在什么位置(或边界)发生。
二、单词边界
一种常用的边界是由限定符\b指定的单词边界,\b用来匹配单词的开始和结尾。更确切地说,它是匹配这样一个位置,这个位置位于一个能够用来构成单词的字符(字母、数字、下划线,也就是与\w相匹配的字符)和一个不能用来构成单词的字符(与\W相匹配的字符)之间。来看前面的例子:
文本:Yesterday is history, tomorrow is a mystery, but today is a gift.
正则表达式:\bis\b
结果:Yesterday 【is】 history, tomorrow 【is】 a mystery, but today 【is】 a gift.
分析:在原始文本中,单词is的前后都有一个空格,而这与模式\bis\b匹配(空格是用来分隔单词的字符之一)。而单词history中也包含了is,因为它的前后分别有一个字符h和t,这两个字符都不能与\b匹配。
如果不匹配一个单词边界,则使用\B。如:
文本:Please enter the nine-digit id as it appears on your color - coded pass-key.
正则表达式:\B-\B
结果:Please enter the 【nine-digit】 id as it appears on your color - coded 【pass-key】.
分析:\B-\B将匹配一个前后都不是单词边界的连字符,nine-digit和pass-key中连字符前后都没有空格,所以能够匹配,而color - coded中连字符前后都有空格,所以不能匹配。
三、字符串边界
单词边界可以用来进行与单词有关的位置匹配(单词开头、结束、整个单词等等)。而字符串边界也有着类似的用途,只不过是用来进行与字符串有关的位置匹配(字符串开头、结束、整个字符串等等)。用来定义字符串边界的元字符有两个:一个是用来定义字符串开头的^,另一个是用来定义字符串结尾的$。
比如要检查一个XML文档的合法性,合法的XML文档都以<?xml…..?>这样形式开头:
文本:
<?xml version="1.0" encoding="UTF-8"?> <project basedir="." default="ear"> </project>
正则表达式:^\s*<\?xml.*?\?>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="ear">
</project>
分析:^匹配一个字符串的开头位置,所以^\s*将匹配一个字符串的开头位置和随后的零个或多个空白字符,因为<?xml>标签前面允许有空格、制表符、换行符等空白字符。
$元字符符的用法除了位置上的差异外,与^用法完全一样。比如,检查一个html页面是否以</html>结尾,可以用模式:</[Hh][Tt][Mm][Ll]>\s*$
四、多行匹配模式
正则表达式可以通过一些特殊的元字符来改变另外一些元字符的行为。可以通过(?m) 来启用多行匹配模式。多行匹配模式将使得正则表达式引擎把行分隔符当做一个字符串分隔符来对待。在多行匹配模式下,^不仅匹配正常的字符串开头,还将匹配行分隔符(换行符)后面的开始位置,$不仅匹配正常的字符串结尾,还将匹配行分隔符(换行符)后面的结束位置。
在使用时,(?m)必须出现在整个模式的最前面。比如,通过正则表达式把一段java代码中的单行注释(以//开始)内容全部找出来。
文本:
publicDownloadingDialog(Frame parent){
//Callsuper constructor, specifying that dialog box is modal.
super(parent,true);
//Setdialog box title.
setTitle("E-mailClient");
//Instructwindow not to close when the "X" is clicked.
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
//Puta message with a nice border in this dialog box.
JPanelcontentPanel = new JPanel();
contentPanel.setBorder(BorderFactory.createEmptyBorder(5,5, 5, 5));
contentPanel.add(newJLabel("Downloading messages..."));
setContentPane(contentPanel);
//Sizedialog box to components.
pack();
//Centerdialog box over application.
setLocationRelativeTo(parent);
}
正则表达式:(?m)^\s*//.*$
结果:
publicDownloadingDialog(Frame parent){
【 //Call superconstructor, specifying that dialog box is modal.】
super(parent,true);
【 //Set dialog boxtitle.】
setTitle("E-mailClient");
【 //Instruct windownot to close when the "X" is clicked.】
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
【 //Put a messagewith a nice border in this dialog box.】
JPanelcontentPanel = new JPanel();
contentPanel.setBorder(BorderFactory.createEmptyBorder(5,5, 5, 5));
contentPanel.add(newJLabel("Downloading messages..."));
setContentPane(contentPanel);
【 //Size dialog boxto components.】
pack();
【 //Center dialogbox over application.】
setLocationRelativeTo(parent);
}
分析:^\s*//.*$将匹配一个字符串的开始,然后是任意多个空白字符,再后面是//,再往后是任意文本,最后是一个字符串的结束。不过这个模式只能找出第一条注释,加上(?m)前缀后,将把换行符视为一个字符串分隔符,这样就可以把每一行注释匹配出来了。
java代码实现如下(文本保存在text.txt文件中):
public static String getTextFromFile(String path) throws Exception{
BufferedReader br = new BufferedReader(new FileReader(new File(path)));
StringBuilder sb = new StringBuilder();
char[] cbuf = new char[1024];
int len = 0;
while(br.ready() && (len = br.read(cbuf)) > 0){
br.read(cbuf);
sb.append(cbuf, 0, len);
}
br.close();
return sb.toString();
}
public static void multilineMatch() throws Exception{
String text = getTextFromFile("E:/text.txt");
String regex = "(?m)^\\s*//.*$";
Matcher m = Pattern.compile(regex).matcher(text);
while(m.find()){
System.out.println(m.group());
}
}
输出结果如下:
//Call super constructor, specifying that dialog box is modal.
//Set dialog box title.
//Instruct window not to close when the "X" is clicked.
//Put a message with a nice border in this dialog box.
//Size dialog box to components.
//Center dialog box over application.
五、小结
正则表达式不仅可以用来匹配任意长度的文本块,还可以用来匹配出现在字符串中特定位置的文本。\b用来指定一个单词边界(\B刚好相反)。^和$用来指定单词边界。如果与(?m)配合使用,^和$还将匹配在一个换行符处开头或结尾的字符串。在接下来的文章中将介绍子表达式的使用。
PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:
JavaScript正则表达式在线测试工具:
http://tools./regex/javascript
正则表达式在线生成工具:
http://tools./regex/create_reg
希望本文所述对大家正则表达式学习有所帮助。
# 正则表达式
# 位置匹配
# 正则表达式匹配用户密码
# Javascript校验密码复杂度的正则表达式
# 手机号码
# 密码正则验证
# php password密码验证正则表达式(8位长度限制)
# js正则实现的密码框简单制作
# 还可以替换成自己想用得符号
# 密码强度检测函数(正则)
# 正则表达式教程之重复匹配详解
# 正则表达式教程之匹配一组字符详解
# 正则表达式教程之匹配单个字符详解
# JS正则匹配中文的方法示例
# 正则匹配密码只能是数字和字母组合字符串功能【php与js实现】
# 分隔符
# 还将
# 换行符
# 都有
# 多个
# 是用来
# 可以通过
# 可以用来
# 相匹配
# 是一个
# 文档
# 是在
# 出来了
# 都不
# 还可以
# 都在
# 也就
# 将在
# 是由
相关文章:
郑州企业网站制作公司,郑州招聘网站有哪些?
建站之星后台管理如何实现高效配置?
深入理解Android中的xmlns:tools属性
如何撰写建站申请书?关键要点有哪些?
建站之星伪静态规则如何设置?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
西安大型网站制作公司,西安招聘网站最好的是哪个?
建站之星如何快速解决建站难题?
如何用5美元大硬盘VPS安全高效搭建个人网站?
威客平台建站流程解析:高效搭建教程与设计优化方案
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
建站三合一如何选?哪家性价比更高?
平台云上自主建站:模板化设计与智能工具打造高效网站
如何通过免费商城建站系统源码自定义网站主题与功能?
如何用wdcp快速搭建高效网站?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何快速登录WAP自助建站平台?
,交易猫的商品怎么发布到网站上去?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何用虚拟主机快速搭建网站?详细步骤解析
网站代码制作软件有哪些,如何生成自己网站的代码?
建站之星Pro快速搭建教程:模板选择与功能配置指南
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
如何访问已购建站主机并解决登录问题?
如何配置支付宝与微信支付功能?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
建站OpenVZ教程与优化策略:配置指南与性能提升
如何规划企业建站流程的关键步骤?
定制建站如何定义?其核心优势是什么?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
音乐网站服务器如何优化API响应速度?
股票网站制作软件,网上股票怎么开户?
如何做静态网页,sublimetext3.0制作静态网页?
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何用免费手机建站系统零基础打造专业网站?
建站之星ASP如何实现CMS高效搭建与安全管理?
,如何利用word制作宣传手册?
如何在IIS中配置站点IP、端口及主机头?
建站之星如何配置系统实现高效建站?
如何快速搭建高效服务器建站系统?
建站之星安装提示数据库无法连接如何解决?
*服务器网站为何频现安全漏洞?
常州自助建站费用包含哪些项目?
linux top下的 minerd 木马清除方法
如何选择高性价比服务器搭建个人网站?
详解jQuery中基本的动画方法
如何在云主机快速搭建网站站点?
*请认真填写需求信息,我们会在24小时内与您取得联系。