问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

正则表达式:按位置匹配

发布网友 发布时间:2022-04-23 05:23

我来回答

3个回答

懂视网 时间:2022-04-23 09:44

这次给大家带来正则的位置匹配使用详解,使用正则位置匹配的注意事项有哪些,下面就是实战案例,一起来看一下。

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

注:在所有例子中正则表达式匹配结果包含在源文本中的【和】之间,有的例子会使用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也匹配出来了。要解决这个问题,使用边界界定符,也就是在正则表达式里用一些元字符来表明我们想让匹配操作在什么位置(或边界)发生。

二、单词边界

一种常用的边界是由限定符指定的单词边界,用来匹配单词的开始和结尾。更确切地说,它是匹配这样一个位置,这个位置位于一个能够用来构成单词的字符(字母、数字、下划线,也就是与w相匹配的字符)和一个不能用来构成单词的字符(与W相匹配的字符)之间。来看前面的例子:

文本:Yesterday is history, tomorrow is a mystery, but today is a gift.

正则表达式:is

结果:Yesterday 【is】 history, tomorrow 【is】 a mystery, but today 【is】 a gift.

分析:在原始文本中,单词is的前后都有一个空格,而这与模式is匹配(空格是用来分隔单词的字符之一)。而单词history中也包含了is,因为它的前后分别有一个字符h和t,这两个字符都不能与匹配。

如果不匹配一个单词边界,则使用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刚好相反)。^和$用来指定单词边界。如果与(?m)配合使用,^和$还将匹配在一个换行符处开头或结尾的字符串。在接下来的文章中将介绍子表达式的使用。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

正则表达式教程的位置匹配教程(附代码)

JS的密码强度校验正则表达式(附代码)

热心网友 时间:2022-04-23 06:52

楼下答案是错误的!

正确的答案是:

^串[12]:01,02,([0-9a-z]{2},){2}99\b(.*)$

热心网友 时间:2022-04-23 08:10

^01,02,\d\d,\d\d,99,?[\d,]*$
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 为什么谋杀的艺术2玩到豪宅的拼图时就自动退回菜单 谁知道007之择日在死,麦当娜唱的那首主题曲叫什么名字 PHP分页程序中的$page.=&#39;,&#39;;和&quot;.($pageval-1).&quot;什么意思?为什么要有点? hushpupp1es中文是什么意思? puppy的复数形式是什么? 英语pupp的复数是什么 温州米面和河粉是一样的吗? 正则表达式如何实现完全匹配? 我的电脑用鲁大师性能测试是:较好!具体看图片还有W7的性能与XP的性能哪个好呢? 花呗每月都是最低还款,会不会影响信誉? 电脑性能测试表 在化学里用某种物质干燥是什么意思 阴历1991年7月初九是什么星座 2000年阴历7月初9是什么星座 二零一零年七月初九是什么星座 1998年七月初九出生的人是什么星座 2002年农历7月初9是什么星座 1991年七月初九应该是什么星座的呀? 我是七月初九出身的,我是哪个星座的? 我是1993年农历七月初九出生的,我是什么星座啊? 苹果6plus充电的时候 为什么手机麻麻的 女孩在男孩家正好父母来了看见了很喜欢这个女孩,是未来儿媳妇是什么电视剧 我是幸运儿电视剧老婆从医院跑出来是第几集 我是幸运儿什么时候上映 腾讯QQ空间哪里来的声音?如何关掉? 下面痒痒的 龟头包皮痒 阴囊奇痒好久了 我前几天*上长了好多包包,有点*的,后来我问了一个医生,他说用高锰酸钾溶液洗,我今天洗了下,以 苹果电脑表格的“属性”参数在哪里? 皮肤瘙痒难耐,太烦人了,一把揪出来哪几个祸首? 身上痒痒是为什么? 为什么我男朋友喜欢玩挠痒痒的游戏? 删掉的号码能一键换到另一个手机吗? 想快速解绑手机号 更换其他手机号 新旧手机如何快速倒换电话号码 随身WiFi怎么测速 100M宽带 为什么用小米随身WiFi 测速就只有 我用善领的随身WIFI,笔记本连接的这个无线网,测速的下载速度还可以,1.4MB每秒。 随身wifi链接在电脑上,网速会变快吗?我家是铁通带光纤的,可最近网速变得超级慢,是不是与路由器有