什么是正则表达式
正则表达式是由普通字符(如英文字母)以及特殊字符(也称为元字符)组成的文字模式。该模式对文本查找时需要匹配的一个或多个字符串描述,给出一个匹配模板。
正则表达式基本书写符号
符号 | 符号 | 示例 | 解释 | 匹配输入 |
---|---|---|---|---|
\ | 转义符 | * | 符号“*” | * |
[ ] | 可接收的字符列表 | [efgh] | e、f、g、h中的任意1个字符 | e、f、g、h |
[^] | 不接收的字符列表 | [^abc] | 除a、b、c之外的任意1个字符,包括数字和特殊符号 | m、q、5、* |
| | 匹配“|”之前或之后的表达式 | ab|cd | ab或者cd | ab、cd |
( ) | 将子表达式分组 | (abc) | 将字符串abc作为一组 | abc |
- | 连字符 | A-Z | 任意单个大写字母 | 大写字母 |
正则表达式限定符
符号 | 含义 | 示例 | 示例 | 匹配输入 | 不匹配输入 |
---|---|---|---|---|---|
* | 指定字符重复0次或n次 | (abc)* | 仅包含任意个abc的字符串,等效于\w* | abc、abcabcabc | a、abca |
+ | 指定字符重复1次或n次 | m+(abc)* | 以至少1个m开头,后接任意个abc的字符串 | m、mabc、mabcabc | ma、abc |
? | 指定字符重复0次或1次 | m+abc? | 以至少1个m开头,后接ab或abc的字符串 | mab、mabc、mmmab、mmabc | ab、abc、mabcc |
{n} | 只能输入n个字符 | [abcd]{3} | 由abcd中字母组成的任意长度为3的字符串 | abc、dbc、adc | a、aa、dcbd |
{n,} | 指定至少 n 个匹配 | [abcd]{3,} | 由abcd中字母组成的任意长度不小于3的字符串 | aab、dbc、aaabdc | a、cd、bb |
{n,m} | 指定至少 n 个但不多于 m 个匹配 | [abcd]{3,5} | 由abcd中字母组成的任意长度不小于3,不大于5的字符串 | abc、abcd、aaaaa、bcdab | ab、ababab、a |
^ | 指定起始字符 | ^[0-9]+[a-z]* | 以至少1个数字开头,后接任意个小写字母的字符串 | 123、6aa、555edf | abc、aaa、a33 |
$ | 指定结束字符 | ^[0-9]-[a-z]+$ | 以1个数字开头后接连字符“–”,并以至少1个小写字母结尾的字符串 | 2-a、3-ddd、5-efg | 33a、8-、7-Ab |
匹配字符集
符号 | 含义 | 示例 | 示例 | 匹配输入 | 不匹配输入 |
---|---|---|---|---|---|
. | 匹配除 \n 以外的任何字符 | a…b | 以a开头,b结尾,中间包括2个任意字符的长度为4的字符串 | aaab、aefb、a35b、a#*b | ab、aaaa、a347b |
\d | 匹配单个数字字符,相当于[0-9] | \d{3}(\d)? | 包含3个或4个数字的字符串 | 123、9876 | 123、9876 |
\D | 匹配单个非数字字符,相当于[^0-9] | \D(\d)* | 以单个非数字字符开头,后接任意个数字字符串 | a、A342 | aa、AA78、1234 |
\w | 匹配单个数字、大小写字母字符,相当于[0-9a-zA-Z] | \d{3}\w{4} | 以3个数字字符开头的长度为7的数字字母字符串 | 234abcd、12345Pe | 58a、Ra46 |
\W | 匹配单个非数字、大小写字母字符,相当于[^0-9a-zA-Z] | \W+\d{2} | 以至少1个非数字字母字符开头,2个数字字符结尾的字符串 | #29、#?@10 | 23、#?@100 |
分组构造
常用分组构造形式 | 说明 |
---|---|
() | 非命名捕获。捕获匹配的子字符串(或非捕获组)。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从1开始自动编号 |
(?) | 命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如 (?‘name’) |
字符转义
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\
正则表达式举例
- 非负整数
^\d+$
- 正整数
^[0-9]*[1-9][0-9]*$
- 非正整数
^((-\d+)|(0+))$
- 整数
^-?\d+$
- 英文字符串
^[A-Za-z]+$
- URL
^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
JAVA正则表达式Pattern和Matcher
Pattern类
Pattern的方法如下: static Pattern compile(String regex) 将给定的正则表达式编译并赋予给Pattern类 static Pattern compile(String regex, int flags) 同上,但增加flag参数的指定,可选的flag参数包括:CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE CASE, CANON EQ int flags() 返回当前Pattern的匹配flag参数 Matcher matcher(CharSequence input) 生成一个给定命名的Matcher对象 static boolean matches(String regex, CharSequence input) 编译给定的正则表达式并且对输入的字串以该正则表达式为模开展匹配,该方法适合于该正则表达式只会使用一次的情况,也就是只进行一次匹配工作,因为这种情况下并不需要生 成一个Matcher实例。 String pattern() 返回该Patter对象所编译的正则表达式。 String[] split(CharSequence input) 将目标字符串按照Pattern里所包含的正则表达式为模进行分割。 String[] split(CharSequence input, int limit) 作用同上,增加参数limit目的在于要指定分割的段数,如将limi设为2,那么目标字符串将根据正则表达式分为割为两段。 一个正则表达式,也就是一串有特定意义的字符,必须首先要编译成为一个Pattern类的实例,这个Pattern对象将会使用matcher()方法来生成一个Matcher实例,接着便可以使用该 Matcher实例以编译的正则表达式为基础对目标字符串进行匹配工作,多个Matcher是可以共用一个Pattern对象的。
Matcher
Matcher方法如下: Matcher appendReplacement(StringBuffer sb, String replacement) 将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里。 StringBuffer appendTail(StringBuffer sb) 将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。 int end() 返回当前匹配的子串的最后一个字符在原目标字符串中的索引位置 。 int end(int group) 返回与匹配模式里指定的组相匹配的子串最后一个字符的位置。 boolean find() 尝试在目标字符串里查找下一个匹配子串。 boolean find(int start) 重设Matcher对象,并且尝试在目标字符串里从指定的位置开始查找下一个匹配的子串。 String group() 返回当前查找而获得的与组匹配的所有子串内容 。 String group(int group) 返回当前查找而获得的与指定的组匹配的子串内容。 int groupCount() 返回当前查找所获得的匹配组的数量。 boolean lookingAt() 检测目标字符串是否以匹配的子串起始。 boolean matches() 尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值。 Pattern pattern() 返回该Matcher对象的现有匹配模式,也就是对应的Pattern 对象。 String replaceAll(String replacement) 将目标字符串里与既有模式相匹配的子串全部替换为指定的字符串。 String replaceFirst(String replacement) 将目标字符串里第一个与既有模式相匹配的子串替换为指定的字符串。 Matcher reset() 重设该Matcher对象。 Matcher reset(CharSequence input) 重设该Matcher对象并且指定一个新的目标字符串。 int start() 返回当前查找所获子串的开始字符在原目标字符串中的位置。 int start(int group) 返回当前查找所获得的和指定组匹配的子串的第一个字符在原目标字符串中的位置。 一个Matcher实例是被用来对目标字符串进行基于既有模式(也就是一个给定的Pattern所编译的正则表达式)进行匹配查找的,所有往Matcher的输入都是通过CharSequence接口提供的,这样做的目的在于可以支持对从多元化的数据源所提供的数据进行匹配工作。