本帖最后由 胡天杭 于 2014-8-26 13:37 编辑
我的csdn原帖:http://blog.csdn.net/zhangyugehu/article/details/38778285
1、认识正则表达式:
用来处理字符串,字符串处理利器。比如用于邮箱格式判断等等
2、MetaCharacters
正则表达式元字符,利用这些元字符来组合成要筛选的字符串格式。
3、简单概念
- <pre name="code" class="java">package com.stephen.practice;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class RegExp {
- public static void main(String[] args) {
- //简单概念
- print("简单概念");
- String regExpCmd="....";
- String str="haha";
- Pattern p=Pattern.compile(regExpCmd);
- Matcher m=p.matcher(str);
- print(m.matches());
- }
- public static void print(Object obj) {
- System.out.println(obj);
- }
- }
复制代码
4、初步认识
以上代码意思,判断类似“....”这样的四个字符的字符串,其中“.”就是元字符,用来代替一个字符。先生成Pattern的静态方法compile()来录入用于判断的元字符,在实例化Matcher并向下转型为Pattern,用他的matcher()方法来把要判断的字符串和元字符格式进行对比,在调用Matcher的natches()获取判断结果。matches的返回值类型是bool型。
- package com.stephen.practice;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class RegExp {
- public static void main(String[] args) {
-
- //初步认识用于判断的元字符
- print("a".matches("."));
- print("aa".matches("aa"));
- print("aaaa".matches("a*"));
- print("aaaa".matches("a+"));
- print("".matches("a*"));
- print("aaaa".matches("a?"));
- print("".matches("a?"));
- print("a".matches("a?"));
- print("2132434342332".matches("\\d{3,100}"));
- print("192.168.1.aaa".matches("\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}"));
- print("192.".matches("[0-2][0-9][0-9]"));
-
- }
- public static void print(Object obj) {
- System.out.println(obj);
- }
- }
复制代码
以上展示了部分元字符的语法用途,如:“.”代表一个字符,“a*”中*代表一个或多个前面的元字符格式,这边是一个或多个a的意思,“a?”中?代表0或多个前面的元字符格式,这里表示0个或多个a,“\\d{3,100}”这种“\\d{n,m}”格式中\\d是一位数字的意思,{n,m}是指定前面格式字符的数量是大于n个,小于m个,{n,}意思是大于n个,以此类推,所以这句的意思是有3到100个数字。更多语法可在jdk api中查看。
5、范围
- package com.stephen.practice;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class RegExp {
- public static void main(String[] args) {
复制代码
"[abc]"代表"[]"中的任何一个,"[]"中的^代表取反,"|"代表或,"&&"代表且。
6、认识\s \w \d \
- package com.stephen.practice;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class RegExp {
- public static void main(String[] args) {
- print("\n\r\t".matches("\\s{4}"));
- print(" ".matches("\\S"));
- print("a_8".matches("\\w{3}"));
- print("abc888&^%".matches("[a-z]{1,3}\\d+[&^%#$]+"));
- print("\\".matches("\\"));
- }
- public static void print(Object obj) {
- System.out.println(obj);
- }
- }
复制代码
"\"在java里回合后面一个字符合成转义字符,所以上面这些就好理解了。
"{a-z}{1,3}\\d+[&^%#$]+" 这一条的意思,首先1到3个a-z之间的字符,后面是一个或多个数字,后面接着一个或多个&^%#$中的一个。
7、边界匹配
- package com.stephen.practice;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class RegExp {
- public static void main(String[] args) {
- //边界匹配
- print("hello sir".matches("^h.*"));
- print("hello sir".matches(".*ir[ DISCUZ_CODE_4 ]quot;));
- print("hello sir".matches("^h[a-z]{1,3}o\\b.*"));
- print("hellosir".matches("^h[a-z]{1,3}o\\b.*"));
- }
- public static void print(Object obj) {
- System.out.println(obj);
- }
- }
复制代码
这里的^不同于[]中的^,这里是字符开始的意思,如"^h.*"是以h开头后面有一个或多个字符的字符串
$表示结尾。这里的\b是单词边界的意思。
以此类推,我们可以得出空白行的判断表达式 即:"^[\\s&&[^\\n]]*\\n$"。
8、matches find lookingAt
- package com.stephen.practice;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class RegExp {
- public static void main(String[] args) {
- //matches find lookingAt
- Pattern p1=Pattern.compile("\\d{3,5}");
- String s="123-21212-234-00";
- Matcher m=p.matcher(s);
- print(m.matches());
- m.reset();
- print(m.find());
- print(m.find());
- print(m.find());
- print(m.find());
- print(m.lookingAt());
- print(m.lookingAt());
- print(m.lookingAt());
- print(m.lookingAt());
- }
- public static void print(Object obj) {
- System.out.println(obj);
- }
- }
复制代码
这里要说到正则表达式的匹配方式,
正则表达式匹配数据时,会一个一个字符来匹配,并且读过的字符不会回滚,
意思就是如果我用matches()方法匹配到了一个符合条件的诗句就会停下来返回true,
下一次在读取的时候会从上次匹配到的地方接着往下匹配,不会从头再来一遍,
所以在用matches()方法是要小心,可以用reset()方法来重置,让他下次读取重头开始。
find()是找字串,找出一个符合的,下一串接着后面找,不会重头来
lookingAt()是从头开始找。
9、start end
可以用start()和end()方法来输出找到的的匹配的字符串的其实和结束位置。
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class RegExp {
- public static void main(String[] args) {
- Pattern p1=Pattern.compile("\\d{3,5}");
- String s="123-21212-234-00";
- Matcher m1=p1.matcher(s);
- print(m1.matches());
- m1.reset();
- print(m1.find());
- print(m1.start()+"-"+m1.end());
- print(m1.find());
- print(m1.start()+"-"+m1.end());
- print(m.find());
- print(m1.start()+"-"+m1.end());
- print(m1.find());
-
- print(m1.lookingAt());
- print(m1.lookingAt());
- print(m1.lookingAt());
- print(m1.lookingAt());
- }
- public static void print(Object obj) {
- System.out.println(obj);
- }
- }
复制代码
10、replacment
- package com.stephen.practice;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class RegExp {
- public static void main(String[] args) {
- Pattern p2=Pattern.compile("java",Pattern.CASE_INSENSITIVE);
- Matcher m2=p2.matcher("java Java JAVa IloveJAVA you hateJava");
- while(m2.find()){
- print(m2.replaceAll("JAVA"));}
- }
- public static void print(Object obj) {
- System.out.println(obj);
- }
- }
复制代码
11、分组
- package com.stephen.practice;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class RegExp {
- public static void main(String[] args) {
- Pattern p3=Pattern.compile("(\\d{3,5})([a-z]{2})");
- Matcher m3=p3.matcher("123aa-3434rr-123cc-00");
- while(m3.find()){
- print(m3.group(1));//打印第一组
- print(m3.group(2));//打印第二组
- print(m3.group());//打印第全部
- }
- }
- public static void print(Object obj) {
- System.out.println(obj);
- }
- }
复制代码
Pattern p3=Pattern.compile("(\\d{3,5})([a-z]{2})");中根据数“(”的个数来确定分了多少组和第几组,默认整个表达式是一组,但不算第一组。
12、Qulifiers
"(.[a-z]{3,10})([0-9])","(.[a-z]{3,10}?)([0-9])","(.[a-z]{3,10}+)([0-9])"的匹配过程区别(greedy qulifiers(X?),Reluctantqulifiers(X??),Possessive qulifiers(X?+))
"(.[a-z]{3,10})([0-9])"先读取10个字符,如果后面的字符不是0-9的数字,则回滚一个字符判断是否是0-9的数字,若不是则一直会滚到第三个字符。
"(.[a-z]{3,10}?)([0-9])"先读取3个字符,判断第四个是不是0-9的数字,如不是则一直往后判断道第10个字符,弱势则匹配成功并退出
"(.[a-z]{3,10}+)([0-9])"读取10个字符,如果后面的字符不是0-9的数字,则匹配失败,并退出
我的csdn原帖:http://blog.csdn.net/zhangyugehu/article/details/38778285 |