规则表示式的使用
可以参考 java.util.regex.Pattern
1、字面意义字符
字母或数字 比较字母或数字
\\ 比较\
\0n 八进制0n字符(0<= n>= 7 )
\0n 八进制0nn字符(0<= n>= 7 )
\0mnn 八进制0mnn字符(0<= n>= 7, 0<= m <=3 )
\xhh 十六进制0xhh字符
\uhhhh 十六进制0xhhh字符
\x{h...h} 十六进制0xh...h字符
\t Tab(\u0009)
\n 换行(\u000A)
\r 返回(\u000D)
\f 换页(\u000C)
\a 响铃(\u0007)
\e ESC(\u001B)
\cx 控制字符x
一些特殊符号
! $ ^ * ( ) + = { } [ ] | \ : . ? 等
2、字符类
[abc] a或b或c任一字符
[^abc] a、b、c以外的任意字符
[a-zA-Z] a到z或A~Z任一字符
[a-d[m-p]] a到d或m~p任一字符,等于[a-dm-p]
[a-z&&[def]] a到z而且是d、e、f的任一字符,等于[def]
[a-z&&[^bc]] a到z而且不是b或c的任一字符,等于[ad-z]
[a-z&&[^m-p]] a到z而且不是m到p的任一字符,等于[a-lq-z]
预定义字符
. 任一字符
\d 比较任一数字,即[0-9]
\D 比较任一非数字字符,即[^0-9]
\s 比较任一空格字符,即[\t\n\x0B\f\r]
\S 比较任一非空格字符,即[^\s]
\w 比较任一ASCLL字符,即[a-zA-Z0-9]
\W 比较任一非ASCLL字符,即[^\w]
3、贪婪、逐步、独吞量词
贪婪量词
X? X项目出现一次或没有
X* X项目出现零次或多次
X+ X项目出现一次或多次
X{n} X项目出现n次
X{n,} X项目至少出现n次
X{n,m} X项目出现n次但不超过m次
贪婪量词:当比较器看到贪婪量词的时候,比较量词会把剩余的文字整个吃掉,再逐步吐出文字,
看看是否符合量词后的规则表达式。如果吐出部分符合,而能吃下部分也符合贪婪
量词就比较成功,结果就是贪婪量词会尽可能的找出长度最长的符合文字。
逐步量词:在贪婪量词表示法后面加上?,就成为了逐步量词,比较器看到逐步量词时,会一边
吃掉剩余的文字,一边看看吃下的文字是否符合规则表达式。
独吞量词:在贪婪量词后面加上+,就成为了独吞量词,比较器看到独吞量词时,会先将剩余的文
字吃掉,然后看看独吞量词部分是否符合吃下的文字,如果符合就不会再吐出来了。
以xfooxxxxxxfoo为例
规则表示式 符合的结果
.* xfooxxxxxxfoo
.*? xfoo和xxxxxxfoo
.*+ 无
4、边界比较(\b标注边界)
如:\bdog\b 则以dog这个单词为分割
常用的一些比较
^ 一行开头
$ 一行结尾
\b 单词边界
\B 非单词边界
\A 输入开头
\G 前一个符合项目结尾
\Z 非最后终端机的输入结尾
\z 输入结尾
5、分组与参考
例如邮箱: ^[a-zA-Z]+\d*@([a-zA-Z0-9]+\.)+com
回头参考:规则表达式 ((A)(B(C)))有四个分组(按左括号的个数来分)
1、( (A) ( B (C) ) )
2、(A)
3、(B ( C) )
4、(C)
例:\d\d要比较两个数字,(\d\d)\1则是要比较四个数字,1212会符合,而1234则不符合.
例:["'][^"']*["']两边的部分为单引号或双引号,但并没有说如果前面的是单引号后面的就必须是
单引号 。
(["']) ["']*\1则两边的符号必须一致
另外比较重要的两个实例
java.util.regex.Pattern
java.util.regex.Matcher
例子:
package useGuiZeBiaoDaShi;
public class useGuiZeBiaoDaShi {
static String[] token = null;
static String strings;
public static void main(String [] args){
//根据逗号切割
useGuiZeBiaoDaShi u = new useGuiZeBiaoDaShi();
strings = "Sun,Fei,Long";
System.out.println("根据逗号分隔"+strings);
token = strings.split(",");
u.outPut(token);
//根据Tab分割
strings = "Sun\tFei\tLong";
System.out.println("根据\\t分隔"+strings);
token = strings.split("\\t");
u.outPut(token);
//根据+分割
strings = "Sun+Fei+Long";
System.out.println("根据+分隔"+strings);
token = strings.split("\\+");
u.outPut(token);
//根据||分割
strings = "Sun||Fei||Long";
System.out.println("根据||分隔"+strings);
token = strings.split("\\|\\|");
u.outPut(token);
//根据\分割
strings = "Sun\\Fei\\Long";
System.out.println("根据\\分隔"+strings);
token = strings.split("\\\\");
u.outPut(token);
//测试字符类
//格局ab分割
strings = "SunabFeiabLong";
System.out.println("根据ab分隔"+strings);
token = strings.split("[a][b]");
u.outPut(token);
//根据汉字分割,可以用来验证字符串是否包含汉字
strings = "Sun孙Fei飞Long";
System.out.println("根据汉字分隔"+strings);
token = strings.split("\\W");
System.out.println(token.length);
if(token.length > 1){
System.out.println("包含汉字");
}
u.outPut(token);
//贪婪,逐步,独吞量词
String [] regexs = {".*foo",".*?foo",".*+foo"};
for(String regex: regexs){
System.out.println("xfooxxxxxxfoo".replaceAll(regex, "Orz"));
}
//日期的格式验证
//---/d/d/d/d-/d/d/d/d/d/d
String date = "1111-111111";
System.out.println("根据/d/d/d/d-/d/d/d/d/d/d分割"+date);
token = date.split("\\d{4}-\\d{6}");
System.out.println(token.length);
if(token.length != 0){
u.outPut(token);
}
else{
System.out.println("符合格式!");
}
}//end main
//输出分割后的字符
public void outPut(String [] token){
for(String s: token){
System.out.println(s);
}
}//end ourPut
}