java核心技术之正则表达式

x33g5p2x  于2021-03-13 发布在 Java  
字(4.9k)|赞(0)|评价(0)|浏览(476)

1.正则表达式

正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE)。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串

2.元字符:

元字符正则表达式的写法意义
.“.”任意一个字符
^“^Spring”以Spring开始的字符
$“EEEE$”匹配行结束符,以”EEEE”结束的字符
\d“\d”0-9的任何一个数字
\D“\D”任何一个非数字字符
\s“\s”空白字符,如”\t”,”\n”
\S“\S”非空白字符
\w“\w”可用作标识符的字符,但不包括“$”
\W“\W”不可用作标识符的字符
\p{Lower}\p{Lower}小定字母a-z
\p{Upper}\p{Upper}大写字母A-Z
\p{ASCII}\p{ASCII}ASCII字符
\p{Alpha}\p{Alpha}字母字符
\p{Digit}\p{Digit}十进制数字,0-9
\p{Alnum}\p{Alnum}数字或字母字符
\p{Punct}\p{Punct}标点符号:!“#%&()*=-
\p{Graph}\p{Graph}可见字符:[\p{Alnum}\p{Punct}]
\p{Print}\p{Print}可打印字符[\p{Graph}\x20]
\p{Blank}\p{Blank}空格或制表符:[\t]
\p{Cntrl}\p{Cntrl}控制字符:[\x00-\x1F\x7F]

3.方括号

方括号括起来若干个字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。
reg=“[abc]4”—– 则”a4”,”b4”,”c4”,都是和此正则表达式匹配的字符串

方括号例子意义
[^456]代表4,5,6之外的任何字符
[a-r]代表a~r中的任何一个字母
[a-Za-Z]代表任意一个英文字母
[a-e[g-z]]代表a~e或g~z中的任意一个字母
[a-o&&[def]]代表字母d,e,f(交运算)
[a-o&&[^bc]]代表字母a,d(差运算)

4.()–小括号

将 () 之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。

5.限定修饰符

使用限定修饰符来限定元字符出现的次数

限定修饰符意义示例
?0次或1次A?
*0次或多次A*
+1次或多次A+
{n}正好出现n次A{2}
{n,}至少出现n次A{2,}
{n,m}出现n到m次A{2,6}

6.几个样例

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class Regular {   
 //字符串是否是数字   
 public static String regexIsDigital = “\d+”;   
 //字符串是否是字母   
 public static String regexIsAlpha =”\p{Alpha}+”;   
 //字符串是否是15位或18位的身体证号码   
 public static String regexIsID=”\d{15}|\d{18}”;   
 //字符串是否是JJJ开头KKK结尾   
 public static String regexIsJJJStartKKKEnd=”^JJJ.*KKK$”;   
 //字符串是否是区号是3或4位数字-(可有可没有)号码任意多少位的数字   
 public static String regexIsTelePhoneNumber =”[0-9]{3,4}\-?[0-9]+”;   
 //X@X.com.cn   
 public static String regexIsEmail = “\w+@\w+(\.\w{2,3})*\.\w{2,3}”;   
 //字符串是否是汉字   
 public static String regexIsHanZi=”[\u4e00-\u9fa5]{1,}”;   
 //查找以Java开头,任意结尾的字符串   
 public static String regexIsStartJava = “^Java.*”;   
 //以多条件分割字符串时   
 public static String regexSplit =”[, |]+”;
public static void main(String[] args) {
   testIsDigit();
   testIsAlpha();
   testIsID();
   testStartEnd();
   testIsTelePhoneNum();
   testEmailAddre();
   testIsHanZi();              
   testIsStartJava();
   testSplit();              
   testReplace();
   testPattern();
 }

 private static void testPattern() {
     Pattern pattern = Pattern.compile("");
     System.out.println(pattern.matches("[0-9]{6}", "200038")); 
     System.out.println(pattern.matches("\\d{6}", "200038")); 
 }

private static void testReplace() {
     Pattern pattern = Pattern.compile("正则表达式");
     Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World");
     //替换第一个符合正则的数据
     System.out.println(matcher.replaceFirst("Java"));
     pattern = Pattern.compile("正则表达式");
     matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World");  
     //替换所有符合正则的数据  
     System.out.println(matcher.replaceAll("Java"));    
 }

 private static void testSplit() {
     Pattern pattern = Pattern.compile(regexSplit);
     String data = "Java Hello World  Java,Hello,,World|Sun";
     System.out.println(data+" split by:"+regexSplit);
     String[] strs = pattern.split(data);
     for (int i=0;i<strs.length;i++) {
         System.out.println(strs[i]);
     }
 }

 private static void testIsStartJava() {        
     pressInfoByPattern("Java不是人",regexIsStartJava);
     pressInfoByPattern("dJava不是人",regexIsStartJava);
 }

 private static void testIsHanZi() {
     pressInfo("验证汉字",regexIsHanZi);
 }

 private static void testIsTelePhoneNum() {
     pressInfo("0733-5544",regexIsTelePhoneNumber);
     pressInfo("073-566544",regexIsTelePhoneNumber);
     pressInfo("073566544",regexIsTelePhoneNumber);
     pressInfo("073--566544",regexIsTelePhoneNumber);
 }

 private static void testStartEnd() {
     pressInfo("JJJKKK",regexIsJJJStartKKKEnd);
     pressInfo("JJJaaaaKKK",regexIsJJJStartKKKEnd);  
     pressInfo("JJaaaaKKK",regexIsJJJStartKKKEnd);
     pressInfo("JJJaaaaKK",regexIsJJJStartKKKEnd);
 }

 private static void testIsID() {              
     pressInfo("111111111111111",regexIsID);
     pressInfo("11111111111111",regexIsID);     
     pressInfo("111111111111122221",regexIsID);
     pressInfo("11111111111112222",regexIsID);                 
 }

 private static void testIsAlpha() {
     pressInfo("da",regexIsAlpha);
     pressInfo("d1a",regexIsAlpha);
 }

 private static void testIsDigit() {          
     pressInfo("21452",regexIsDigital);
     pressInfo("21a452",regexIsDigital);
     pressInfo("021452",regexIsDigital);
 }

 private static void testEmailAddre() {                      
     pressInfo("aaa@",regexIsEmail);
     pressInfo("aaaaaaaa",regexIsEmail);
     pressInfo("11111@11111fffyu.dfg.com",regexIsEmail);                
 }

 private static void pressInfo(String data,String regex) {            
     if(data.matches(regex)){
         System.out.println(data+":is match regex:"+regex);
     }else{
         System.out.println(data+":is not match regex:"+regex);
     }
 }

 private static void pressInfoByPattern(String data,String regex) {              
     Pattern pattern = Pattern.compile(regex);
     Matcher matcher = pattern.matcher(data);
     if(matcher.matches()){
         System.out.println(data+":is match regex:"+regex);
     }else{
         System.out.println(data+":is not match regex:"+regex);
     }
 }

}

7自己的话

曾经,看到别人能用正则表达式,而自己不会,当时好自卑啊,觉得别人好厉害啊。直到后来,自己坐下来,好好的看了一些正则表达式的资料和例子后,觉得,啊,原来如此。也就是这样,一点都不复杂啊。绝知此事要躬行,古人的话还是有道理的。

相关文章