30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。
最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门。当然,如果你是超人,那自 然得另当别论。
别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难。当然,如果你看完了这篇教程之 后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性 为零。这里只是让你明白基本的原理,以后你还需要多练习,多使用,才能熟练掌握正则表达式。
除了作为入门教程之外,本文还试图成为可以在日常工作中使用的正则表达式语法参考手册。就作者本人的经历来说,这个目标还是完成得不错的——你看,我自己 也没能把所有的东西记下来,不是吗?
文本格式约定:专业术语 元字符/语法格式 正则表达式 正则表达式中的一部分(用于分析) 用于在其中搜索的字符串 对正则表达式或其中一部分的 说明
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则 表达式就是记录文本规则的代码。
很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果 你想查找某个目录下的所有的Word文档的话,你会搜索*.doc。在这里,*会被解释成任意的。和通配符类似,正则表达式也是用来进行的工具 ,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0 开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像010-或)。
正则表达式是用于进行文本匹配的工具,所以本文里多次提到了在字符串里搜索/查找,这种说法的意思是在给定的字符串中,寻找与给定的正则表达式相匹配的部 分。有可能字符串里有不止一个部分满足给定的正则表达式,这时每一个这样的部分被称为一个匹配。匹配在本文里可能会有三种意思:一种是形容 词性的,比如说一个字符串匹配一个表达式;一种是动词性的,比如说在字符串里匹配正则表达式;还有一种是名词性的,就是刚刚说到的“字符串中满足给定的正则表达式 的一部分”。
学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子进行修改,实验。下面给出了不少简单的例子,并对它们作了详细的说明。
假设你在一篇英文小说里查找hi,你可以使用正则表达式hi。
这是最简单的正则表达式了,它可以精确匹配这样的字符串:由两个字符组成,前一个字符是h,后一个是i。通常,处理正则表达式的工具会提供 一个忽略大小写的选项,如果选中了这个选项,它可以匹配hi,HI,Hi,hI这四种情况中的任意一种。
不幸的是,很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确 地查找hi这个单词的话,我们应该使用\bhi\b。
\b是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单 词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格或标点符号或换行来分隔的,但是\b并不匹配这些单词分隔符中的任何 一个,它只匹配一个位置。(如果需要更精确的说法,\b匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是 或不存在)\w)
假如你要找的是hi后面不远处跟着一个Lucy,你应该用\bhi\ 下的工具。 首先你确保已经安装了,然后。这是个绿色软件,下载完后打开压缩包,直接运行匹配,c:\\Windows匹配c:\Windows。
你已经看过了前面的*,+,{2},{5,12}这几个匹配重复的方 式了。下面是正则表达式中所有的限定符(指定数量的代码,例如*,{5,12}等):
报警字符(打印它的效果是电脑嘀一声) |
通常是单词分界位置,但如果在字符类里使用代表退格 |
ASCII代码中八进制代码为nn的字符 |
ASCII代码中十六进制代码为nn的字符 |
Unicode代码中十六进制代码为nnnn的字符 |
字符串开头(类似^,但不受处理多行选项的影响) |
字符串结尾或行尾(不受处理多行选项的影响) |
字符串结尾(类似$,但不受处理多行选项的影响) |
在子表达式exp中改变处理选项 |
为表达式后面的部分改变处理选项 |
把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no |
同上,只是使用空表达式作为no |
如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no |
同上,只是使用空表达式作为no |
好吧,我承认,我骗了你,读到这里你肯定花了不止30分钟.相信我,这是我的错,而不是因为你太笨.我之所以说"30分钟",是为了让你有信心,有耐心继续下去.既然你看到了这里, 那证明我的阴谋成功了.上这种当的滋味还不错吧?
要投诉我,或者觉得我其实可以做得更好,或者有任何其它问题,欢迎来进行讨论.
关于正则的使用视频,详见第12天的课程,Java常用类库 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
在典型的搜索和替换操作中,必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了,但是由于它缺乏灵活性,因此在搜索动态文本时就有困难了,甚至是不可能的。 使用正则表达式,就可以:
例如,如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记,则可以使用正则表达式对每个文件进行测试,看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法,就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料,最后,可以再次使用正则表达式来查找并替换那些需要替换的标记。 另一个说明正则表达式非常有用的示例是一种其字符串处理能力还不为人所知的语言。VBScript 是 Visual Basic 的一个子集,具有丰富的字符串处理功能。与 C 类似的 Jscript 则没有这一能力。正则表达式给 JScript 的字符串处理能力带来了明显改善。不过,可能还是在 VBScript 中使用正则表达式的效率更高,它允许在单个表达式中执行多个字符串操作。 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 这里有一些可能会遇到的正则表达式示例:
下表是元字符及其在正则表达式上下文中的行为的一个完整列表:
从上面我们可以看到: "^ "表示后面紧跟着的字符为开头;与之相对应的式 "$ "以紧跟前面的字符为结尾.但是要注意的式当 "^ "位于 "[] "里时,表示 "非 "的意思,例如:[^AZ]表示不能为 "AZ "中的任一个字符. "[] "表示当中的一个字符. "{} "可以取得一个范围,例如 "{9} "表示9个,而 "{1,9} 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 这里有一些可能会遇到的正则表达式示例:
下表是元字符及其在正则表达式上下文中的行为的一个完整列表:
|
我是灼灼,一只初学Java的大一金渐层。
向往余秀华和狄兰·托马斯的疯狂,时常沉溺于将情感以诗相寄;追逐过王尔德、王小波的文字,后陷于毛姆和斯蒂芬·金不可自拔;热爱文学的浪潮,白日梦到底却总在现实里清醒;艳羡平静又极度渴盼奔跑的力量。
欢迎与我交流鸭· QQ:;
获取到
Matcher
对象后,不需要调用matches()
方法(因为匹配整个串肯定返回false),而是反复调用find()
方法,在整个串中搜索能匹配上\\wo\\w
规则的子串,并打印出来。这种方式比String.indexOf()
要灵活得多,因为搜索的规则是3个字符:中间必须是o
,前后两个必须是字符[A-Za-z0-9_]
。使用正则表达式替换字符串可以直接调用
String.replaceAll()
,它的第一个参数是正则表达式,第二个参数是待替换的字符串。例子:上面的代码把不规范的连续空格分隔的句子变成了规范的句子。灵活使用正则表达式可以大大降低代码量。
如果要把搜索到的指定字符串按规则替换,比如前后各加一个
<b>xxxx</b>
,这个时候,使用replaceAll()
的时候,传入的第二个参数可以使用$1
、$2
来反向引用匹配到的子串。例如:上述代码的运行结果是:
有关Java中的正则表达式知识就到这里了!
如果对你有帮助的话不要忘记一键三连噢~
正则表达式是一个编程的艺术,很难调试,学习和理解,但强大的功能,仍吸引不少开发者编写正则表达式。让我们探索一下下面10个实际应用中的正则表达式。
1. 用户名正则表达式模式
2. 密码正则表达式模式
3. 16进制颜色代码正则表达式模式
5. 图像文件扩展名正则表达式模式
6. IP地址正则表达式模式
7. 时间格式正则表达式模式
12-小时制时间正则表达式模式
9. HTML标签正则表达式模式
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。