淘先锋技术网

首页 1 2 3 4 5 6 7
正则表达式基础:
| 管道符号:x|y , 表示x或者y
()  捕获组,(abc)|(xyz)  表示abc或者xyz
^ 从头匹配
$匹配到尾部
. 匹配任意一个符号
[abcd] 表示匹配任意abcd其中一个
[^abc]  表示匹配除了a,b,c之外的任意字符
[a-zA-z] 表示匹配a-z或者A-Z中的任意一个符号(并集)
[a-b[x-z]] 表示a-b和x-z的并集合
[a-z&&[def]] 表示a,b,c中的任意一个  (交集)
\s 空字符([\t\n\x0B\f\r])
\S  非空符
\d 任意一个数字
\D 任意一个非数字
\w 表示 [a-zA-Z_0-9] 任意大小字母,下划线或者数字
\W 与\w相反

帮助记忆:
小写与大写含义相反,
^ 表示除了Xxx的意思
[ ] 表示一个字符的意思

注意上述说的都是表示匹配一个.

如果要多次匹配需要使用下面的几种符号:
*  0次或者多次
+ 1次或者多次
? 0次或者1次
{n}  恰好n次
{n,m} 至少n次,之多m次

案例:
匹配工具方法
public static boolean RegUtils(String reg,String string){
	boolean result;
	Pattern pattern = Pattern.compile(reg);
	Matcher matcher = pattern.matcher(string);
	result= matcher.matches();
	return result;	
}

1)  |  符号
String reg = "[a|b]";
System.out.println(RegUtils(reg,"c"));  //false
SyString reg="^[a-zA-z]+";
		System.out.println(startCheck(reg,"abcccc"));stem.out.printl^n(RegUtils(reg,"a"));  //true
System.out.println(RegUtils(reg,"b"));  //true

表示匹配一个a或者b,和 
[ab]
[a]|[b]
效果一样

2)()   捕获组的符号
如果我们不仅要匹配我们想要查找的符号,而且还要将匹配的符号去除,那么我们就需要用到这个符号
Pattern pattern = Pattern.compile(reg);
Matcher m = pattern.matcher("a12121212ABCDEF");
System.out.println(m.find()?m.group(1):"nothing");
System.out.println(m.find()?m.group(2):"nothing");

结果:
12121212
nothing
好像每次matcher比较只能取出一次.??
3. ^ 从头匹配,$ 匹配到尾部
String reg="^[\\d]+[a-z][\\d]+$";
System.out.println(RegUtils(reg,"121a11"));

注意颜色的对应.
^[\\d]+  表示从头匹配多次的数组
[a-z]  表示匹配a-z之间的一个符号
[\\d]+$  表示匹配尾部多次的数组符号
  
4 .   . 匹配任意一个符号
String reg="^[\\d].+";
System.out.println(RegUtils(reg,"121a1@#$@@%@%@%@1"));  

结果:
true

^[\\d]+  表示匹配多次的数组
.+  表示匹配多次的任意字符

5.  [abcd]    匹配由abcd四种字符组成的字串
String reg="^[abcd]+";
System.out.println(RegUtils(reg,"abcccc"));

结果:
true
在这里的[abcd] 表示可以匹配其中的任意一个字符,+则表示匹配多次,
^ 则表示从头开始匹配,这样就可以匹配由abcd四种字符组成的字串了.
[^abc]  匹配除了a,b,c之外的任意字符
String reg="^[^abcd]+";
System.out.println(RegUtils(reg,"ahjkl"));

结果:
false
^ 表示相反的意思,也就是说,不带符号的时候表示匹配任意字符,带了这个符号表示
不匹配包含这个符号的任意字符.
[a-zA-z] 表示匹配a-z或者A-Z中的任意一个符号(并集)

String reg="^[a-zA-z]+";
System.out.println(RegUtils(reg,"abcccc"));
表示匹配大小写字母.
[a-b[x-z]] 表示a-b和x-z的并集合

String reg="^[a-b[x-z]]+";
System.out.println(RegUtils(reg,"abcccc"));  //false
System.out.println(RegUtils(reg,"abxz"));  //true


[a-z&&[def]] 表示a,b,c中的任意一个  (交集)

相当于数学中的[a,z]的区间,与[d,f]  区间的交集
String reg="^[a-z&&[def]]+";
System.out.println(RegUtils(reg,"ab"));  //false
System.out.println(RegUtils(reg,"def"));  //true


*  0次或者多次
+ 1次或者多次
? 0次或者1次
{n}  恰好n次
{n,m} 至少n次,之多m次

?  匹配0次或者1次
String reg="^[\\d]?[a-z\\d]$";
System.out.println(RegUtils(reg,"1a")); //true
System.out.println(RegUtils(reg,"a")); //true
System.out.println(RegUtils(reg,"12345a")); //false
红色部分表示^[\\d]? 匹配的方式,也就是说如果多出了一个就会匹配失败.
{n,m}   案例:
String reg="^[\\d]{2,5}";
System.out.println(RegUtils(reg,"1234567"));
System.out.println(RegUtils(reg,"12345"));
这里表示的是从开始匹配数组2~5位数,也就是最多匹配5个符号,最少匹配2个符号.超过获取这数组位数不够都会在成匹配
失败.
在匹配手机号码中经常使用.
例如:匹配以1开始的11为手机号码:  "^[1][\\d]{11}"

实用的案例:
匹配汉字:"^[\u4e00-\u9fa5]+"
Email地址:"[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+"InternetURL:"^http://([\\w-]+\.)+[\\w-]+(/[\\w-./?%&=]*)?$"电话号码:"^(\\(\\d{3,4}-)|\\d{3.4}-)?\\d{7,8}$"    正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"身份证号(15位或18位数字):"^\\d{15}|\\d{18}$"一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"






</pre><br /><br />