正则表达式在我眼中是一种非常强大的工具,可以判断输入的文本是不是与要求匹配,从输入的文件中提取关键信息等等,而在实验以及学习过程中,我接触到的使用的最多的功能就是判断字符串与要求的格式是否匹配,下面是一个超级简单的例子
Pattern p = Pattern.compile("\\w+");
Matcher m = p.matcher(INPUT);
这个语句判断的是INPUT的格式是否为一个或多个字符的形式(\\w+),如果是,那么 m.find()就为true,否则为false。
从这个例子类推,根据不同的正则格式的表达就可以匹配多种形式的字符串,下面是我选出来的比较常用的一些匹配格式:
正则字符 匹配字符串
\ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符
. 任意字符
* 零次或多次匹配前面的字符或子表达式,例如,op* 匹配"opo"和"oppo"
+ 至少一次或多次匹配前面的字符或子表达式,例如,"op+"匹配"opp",不匹配"o"
^ 匹配输入字符串开始的位置
$ 匹配输入字符串结尾的位置
? 零次或一次匹配前面的字符或子表达式
[xyz] 字符集。匹配字符集中任一字符
x|y 匹配 x 或 y
{n} n 是非负整数,正好匹配 n 次,例如:o{2}匹配"oppo"
[a-z] 字符范围
[^a-z] 反向范围字符,匹配不在指定的范围内的任何字符
\d 数字字符匹配
\D 非数字字符匹配
\n 换行符匹配
\s 匹配任何空白字符
\S 匹配任何非空白字符
\t 制表符匹配
\w 匹配任何字类字符
\W 与任何非单词字符匹配
需要注意的是正则表达式同一字符的大小写不同匹配的字符串也会不同,而且一般如果小写匹配的是哪种字符,大写匹配的是哪种字符的反义,还有,一些字符本身在正则表达式里面就有特殊含义,比如.(匹配任意字符),那么在匹配"."这个字符的时候,就需要用到转义字符\\,也就是"\\."这种形式。
还有一个很好用的概念是捕获组,捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
例如,正则表达式 (hey) 创建了一个单一分组,组里包含"h","e",和"y"。
捕获组通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个组:
((A)(B(C)))
(A)
(B(C))
(C)
可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。
还有一个特殊的组(group(0)),代表整个表达式。不包括在 groupCount 的返回值中。
在pattern类中,compil()方法还可以接受一个很好用的标记参数,下面是这些标记参数与他们编译的效果
Pattern.CANON_EQ
当且仅当两个字符的"正规分解"都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式"a/u030A"会匹配"?"。默认情况下,不考虑"规范相等性"。
Pattern.CASE_INSENSITIVE(?i)
默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。这个是非常常用的标记参数之一。在实验中也用到了,可以增强用户输入以及文本输入的容错性。
Pattern.COMMENTS(?x)
在这种模式下,匹配时会忽略(正则表达式里的)空格字符(不是指表达式里的"//s",而是指表达式里的空格,tab,回车之类)。这也是非常常用的标记参数之一。
Pattern.DOTALL(?s)
在这种模式下,表达式'.'可以匹配任意字符,包括表示一行的结束符。
Pattern.MULTILINE(?m)
在这种模式下,'^'和'$'分别匹配一行的开始和结束。此外,'^'仍然匹配字符串的开始,'$'也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。这也是非常常用的标记参数之一。
Pattern.UNICODE_CASE(?u)
在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不明感的匹配,默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。
Pattern.UNIX_LINES(?d)
在这个模式下,只有'/n'才被认作一行的中止,并且与'.','^',以及'$'进行匹配。
split()函数
这是实验里面用的次数相当多的一个函数了,它可以将字符串按照要求划分成一个字符串数组,比如,将"192.168.52.11"划分成一个大小为4,每个位置装一段数字的数组,只需要
input = "192.168.52.11";
String[] temp = input.split("\\.");
那么temp数组里面装的就分别是"192","168","52","11"。非常适用于要在一长串字符串里面按照格式划分查找信息。比如时间,比如在日志里面用"|"分开的各个信息,要找到属于哪个类,哪个方法,就会频繁的用到这个函数。