正则表达式

天小华君要跟大家分享的内容如题,就是正则表达式。说实话,一篇文章想把正则表达式的内容全部说清楚,是不太现实的,一是本身正则表达式要掌握的东西就不少,二是他也同样需要你自己的实际操作练习才能更好地掌握。不过,小华君希望通过这一篇文章让大家对正则表达式有基本的了解,可以在自己的网页制作或者程序制作中使用它。

首先,我们来看一下什么是正则表达式。

正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。许多程序设计语言都支持利用正则表达式进行字符串操作。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。简单点说,我们在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。一句话概括,正则表达式就是记录文本规则的代码。

用一个草图来看正则表达式的工作原理,大概就是这样:

每天学Java!一篇文章看懂正则表达式

我们用一个例子来理解。假设你在一篇英文小说里查找hi,你使用正则表达式hi,那么它就可以精确匹配这样的字符串:由两个字符组成,前一个字符是h,后一个字符是i。处理正则表达式的工具通常会提供一个忽略大小写的选项,如果选中了这个选项,那么它可以匹配,hi,hI,Hi,HI四中情况中的全部情况。

一般情况下,虽然你只想查找hi,但是由于像hit,him,hibit这类词语,因为包含hi,也会被查找出来。如果我们想精确地查找hi怎么办?这个时候,元字符的功能就体现出来了。元字符\b就可以解决这一类的问题。

\b 匹配单词的开始或结束,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。

假如你要找的是hi后边隔了一些字符的的like,那么你应该用你应该用\bhi\b.*\blike\b。

.也是一个元字符,可以匹配除了换行符以外的任意字符。*也是元字符,只不过它代表的是数量,它指定*之前的内容可以连续重读使用任意次以使整个表达式得到匹配。所以,.和*连在一起使用就意味着数量的不包含换行的字符。\bhi\b.*\blike\b意思就是先是单词hi,然后是任意个任意字符,但是不能换行,最后是like这个单词。

除了\b、.和*之外,还有一些常用的元字符。\d匹配数字。\w匹配字母或数字或下划线或汉字。\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。$匹配字符串的结束,^匹配字符串的开始。

如果你想查找元字符本身,比如.或者*,这时候就需要使用\来实现字符转义,取消这些字符的特殊意义,也就是说你需要使用\.和\*。即使是查找\本身,也需要使用\\。比如baidu\.com,匹配baidu.com。

在匹配重复方式上,正则表达式也有限定符。* 重复零次或更多次。+ 重复一次或更多次。? 重复零次或一次。{n} 重复n次。{n,} 重复n次或更多次。{n,m} 重复n到m次。比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$。{5,12}表示重复的次数不能少于5次,不能多于12次,否则都不匹配;Windows\d+匹配Windows后面跟1个或更多数字。

由于已经有了对应数字、字母、空白这些字符集合的元字符,所以我们我们想查找数字、字母、空白是很简单的,但是如果想匹配没有预定义元字符的字符集合怎么办?很简单,拿元音字母a,e,i,o,u做例子。很简单,只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。也可以轻松地指定一个字符范围,像[0-9]代表的含意与\d就是完全一致的:一位数字。同理[a-z0-9A-Z_]也完全等同于\w(只考虑英文)。

来看一个更复杂的表达式。\(?0\d{2}[) -]?\d{8}。这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。不幸的是,这个表达式也能匹配010)12345678或(022-87654321这样的“不正确”的格式。要解决这个问题,我们需要用到分枝条件。正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。比如,0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。要注意的是,使用分枝条件时,要注意各个条件的顺序,因为匹配分枝条件时,将会从左到右测试每一个条件,如果满足了某一个分枝,其他条件就会被忽略。

在字符后边加上限定符可以重复单个字符,如果想重复多个字符可以通过小括号来指定子表达式,也叫作分组,这样就可以指定这个子表达式的重复次数。(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。

以上,小华君主要是跟大家讲了元字符、字符转义、重复、字符类和分枝条件、分组,关于正则表达式的反义、零宽断言、贪婪与懒惰、处理选项这些内容,小华君就简单地说一下吧。

反义

\W 匹配任意不是字母,数字,下划线,汉字的字符

\S 匹配任意不是空白符的字符

\D 匹配任意非数字的字符

\B 匹配不是单词开头或结束的位置

[^x] 匹配除了x以外的任意字符

[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

懒惰与贪婪

*? 重复任意次,但尽可能少重复

+? 重复1次或更多次,但尽可能少重复

?? 重复0次或1次,但尽可能少重复

{n,m}? 重复n到m次,但尽可能少重复

{n,}? 重复n次以上,但尽可能少重复

零宽断言

(?=exp) 匹配exp前面的位置

(?<=exp) 匹配exp后面的位置

(?!exp) 匹配后面跟的不是exp的位置

(?<!exp) 匹配前面不是exp的位置

选项

IgnoreCase(忽略大小写) 匹配时不区分大小写。(javascript: i)

Multiline(多行模式) 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) (javascript: m)

global 全局匹配 (javascript: g)

Singleline(单行模式) 更改.的含义,使它与每一个字符匹配(包括换行符\n)。

IgnorePatternWhitespace(忽略空白) 忽略表达式中的非转义空白并启用由#标记的注释。

ExplicitCapture(显式捕获) 仅捕获已被显式命名的组。

附一张归纳好的图

每天学Java!一篇文章看懂正则表达式

最后,小华君依然欢迎大家评论补充或指正。好了,小华君要接着整理关于北京华信智原Java课程升级的资料的,高校的专家老师团在做了市场调研之后,指导做出了课程体系的升级,结合了最前沿的技术和市场最紧缺的需要,如果你想在四个月内学Java,不妨来这里试听一节课。


文章摘自:http://www.toutiao.com/i6319299168963658241/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值