关注「Java视界」公众号,获取更多技术干货

正则表达式

一、常见匹配规则:

(匹配单个)

  1. \\:匹配“\”
  2. \n:匹配换行
  3. \t:匹配制表符
  4. [abc]:表示可能是a、b、c中的任意一个
  5. [^abc]:表示不是a、b、c中的任意一个
  6. [a-zA-Z]:表示任一字母,不区分大小写
  7. [0-9]:表示任一数字

(简化匹配)

  1. .:任意一个字符,.*匹配除 \n 以外的任何字符。
  2. \d:等价于[0-9]
  3. \D:等价于[^0-9]
  4. \s:任意空格,可能是空格、换行、制表符
  5. \S:任意的非空格数据
  6. \w:字母、数字、下划线,等价于[a-zA-Z_0-9]
  7. \W:与\w相反,等价于[^a-zA-Z_0-9]

(边界匹配)

  1. ^:边界开始
  2. $:边界结束

(数量匹配)

  1. 表达式?:0次或1次
  2. 表达式*:0次、1次或多次
  3. 表达式+:1次或多次
  4. 表达式{n}:表达式长度为n
  5. 表达式{n,}:表达式长度为n以上
  6. 表达式{n,m}:表达式长度为n~m次

(逻辑匹配)

  1. XY:表达式X后紧跟表达式Y
  2. X|Y:有一个表达式满足即可
  3. (表达式):表明是一个整体,可以作为数量的设置单位

二、常见正则表达式

一、校验数字的表达式

【数字】^[0-9]*$

【n位的数字】^\d{n}$

【至少n位的数字】^\d{n,}$

【m-n位的数字】^\d{m,n}$

【零和非零开头的数字】^(0|[1-9][0-9]*)$

【非零开头的最多带两位小数的数字】^([1-9][0-9]*)+(.[0-9]{1,2})?$

【带1-2位小数的正数或负数】^(\-)?\d+(\.\d{1,2})?$

【有两位小数的正实数】^[0-9]+(.[0-9]{2})?$

【有1~3位小数的正实数】^[0-9]+(.[0-9]{1,3})?$

【非零的正整数】^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$

【非零的负整数】^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$

【非负整数】^\d+$ 或 ^[1-9]\d*|0$

【非正整数】^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$

【非负浮点数】^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

【非正浮点数】^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

【正浮点数】^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

【负浮点数】^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 

【浮点数】^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

二、校验字符的表达式

【汉字】^[\u4e00-\u9fa5]{0,}$

【英文和数字】^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

 【长度为3-20的所有字符】^.{3,20}$

【由26个英文字母组成的字符串】^[A-Za-z]+$

【由26个大写英文字母组成的字符串】^[A-Z]+$

【由26个小写英文字母组成的字符串】^[a-z]+$

【由数字和26个英文字母组成的字符串】^[A-Za-z0-9]+$

【由数字、26个英文字母或者下划线组成的字符串】^\w+$ 或 ^\w{3,20}$

【中文、英文、数字包括下划线】^[\u4E00-\u9FA5A-Za-z0-9_]+$

【中文、英文、数字但不包括下划线等符号】^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

【可以输入含有^%&',;=?$\"等字符】[^%&',;=?$\x22]+ 12

【禁止输入含有~的字符】[^~\x22]+

【/[\uFF00-\uFFFF]/】 全角符号

【/[\u0000-\u00FF]/】半角符号

三、特殊需求表达式

【Email地址】^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

【域名】[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

【InternetURL】[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

【手机号码】^1[3456789]\d{9}$

【电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX)】^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$

【国内电话号码(0511-4405222、021-87888822)】\d{3}-\d{8}|\d{4}-\d{7}

【身份证号(15位、18位数字)】^\d{15}|\d{18}$

【短身份证号码(数字、字母x结尾)】^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

【日期格式】^\d{4}-\d{1,2}-\d{1,2}

【一年的12个月(01~09和1~12)】^(0?[1-9]|1[0-2])$

【一个月的31天(01~09和1~31)】^((0?[1-9])|((1|2)[0-9])|30|31)$

【腾讯QQ号】[1-9][0-9]{4,} (腾讯QQ号从10000开始)

【中国邮政编码】/^[0-9]{6}$/ (中国邮政编码为6位数字)

三、String类对正则的支持

  • matches()
  • replaceAll()
  • split()

(字符串替换)-->把非字母或数字的字符去掉

String str = "sadas@#@dads5_&&azxc14&*&&dfsdf";
String regex = "[^a-zA-Z0-9]+";
System.out.println(str.replaceAll(regex, ""));
sadadads5azxc14dfsdf

(字符串拆分)

String str = "aa4wf6wfe66serwed46sd46";
String regex = "\\d+";
String result [] = str.split(regex);
for (int i = 0; i < result.length; i++) {
   System.out.print(result[i] + "、 ");
}
aa、 wf、 wfe、 serwed、 sd、 

String类可以完成很多的正则操作,最起码在处理拆分、匹配、替换时,String更加方面,除非是很复杂的正则才会用到java.util.regex包中的类。

四、正则表达式匹配模式[贪婪型、勉强型、占有型]

4.1 Greediness(贪婪型):最大匹配

X?、X*、X+、X{n,} 是最大匹配。例如你要用 “<.+>” 去匹配 “a<tr>aava </tr>abb”,也许你所期待的结果是想匹配 “<tr>”,但是实际结果却会匹配到 “<tr>aava </tr>。

在 Greediness 的模式下,会尽量大范围的匹配,直到匹配了整个内容,这时发现匹配不能成功时,开始回退缩小匹配范围,直到匹配成功

String test = "a<tr>aava </tr>abb ";
String reg = "<.+>";
System.out.println(test.replaceAll(reg, "###"));

输出:a###abb

4.2  Reluctant(Laziness)(勉强型):最小匹配 

X??、X*?、X+?、X{n,}? 是最小匹配,其实X{n,m}?和X{n }?有些多余。在 Greediness 模式之后添加 ? 就成最小匹配。

在 Reluctant 的模式下,只要匹配成功,就不再继续尝试匹配更大范围的内容

String test = "a<tr>aava </tr>abb ";
String reg = "<.+?>";
System.out.println(test.replaceAll(reg, "###"));

输出:a###aava ###abb

与 Greediness 不同,Reluctant 模式下匹配了两次内容

4.3 Possessive(占有型):完全匹配 

X?+、X*+、X++、X{n,}+ 是完全匹配,在 Greediness 模式之后添加 + 就成完全匹配。

Possessive 模式与 Greediness 有一定的相似性,那就是都尽量匹配最大范围的内容,直到内容结束,但与 Greediness 不同的是,完全匹配不再回退尝试匹配更小的范围。

String s = "a<tr>aava </tr>abb ";
// (占有型):完全匹配,只有一模一样才能匹配上
String reg = "<.++>";
String reg1 = "<tr>aava </tr>";
System.out.println(s.replaceAll(reg, "###"));
System.out.println(s.replaceAll(reg1, "###"));

输出:a<tr>aava </tr>abb

           ###

posted @ 2022-06-25 14:03  沙滩de流沙  阅读(47)  评论(0编辑  收藏  举报

关注「Java视界」公众号,获取更多技术干货