正则表达式简单学习与常用表达式

正则表达式的概念

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表达式的匹配规则

参照JDk1.9 Api,在java.util.regex.Pattern类中有正则表达式的规则定义,值得注意的是:正则表达式中明确区分字母大小写

正则表达式的语法规则:

普通字符

  普通字符指没有明确指定为元字符的所有字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
例如:

import java.util.regex.Pattern;

String str = "test";
String pattern = "test";
boolean isMatch = Pattern.matches(pattern, str);
System.out.println("str字符串是否是\"test\"? "+ isMatch);
// 输出结果: str字符串是否是"test"? true

特殊字符

 特殊字符指在正则表达式中,含有特定意义的字符,例如常用的'\',它表示转义的意思(改变这个字符串原来的意义)
 许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。下表列出了正则表达式中的特殊字符:

特殊字符 描述
\                 改变下一个字符的原有意义:将特殊字符转义为原义字符、将原义字符标记为特殊字符、向后引用、八进制转义符。例如: 'n' 匹配字符 'n','\n' 匹配换行符。 '\\' 匹配 "\",而 '\{' 则匹配 "{"。
{ 表示限定符表达式的开始。要匹配 {,请使用 \{。
$ 表示输入字符串的结尾。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
  • | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
  • | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
    ? | 匹配前面的子表达式零次或一次。要匹配 ? 字符,请使用 \?。
    . | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。
    [ | 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
    ^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。
    | | 指明两项之间的一个选择。要匹配 |,请使用 \|。
    例如:
  • 字符:\\
     含义: 代表的是反斜线字符'\'
     例:  匹配规则为"\\" ,那么匹配的字符串内容就是 ”\”
  • 字符类:[abc]
     含义: 代表的是字符a、b 或 c
     例:  匹配规则为"[abc]" ,那么匹配的内容就是字符a,或者字符b,或字符c的一个
 String pattern = "[abc]";
 String srt1 = "a";
 String srt2 = "ab";
 boolean isMatch1 = Pattern.matches(pattern, srt1);
 System.out.println("str1字符串是否是a、b、c三个中的其中一个?"+isMatch1);
 // str1字符串是否是a、b、c三个中的其中一个?true
 boolean isMatch2 = Pattern.matches(pattern, srt2);
  System.out.println("str2字符串是否是a、b、c三个中的其中一个?"+isMatch2);
 // str2字符串是否是a、b、c三个中的其中一个?false
  • 字符类:[^abc]
     含义: 代表的是除了 a、b 或 c以外的任何字符
     例:  匹配规则为"[^abc]",那么匹配的内容就是非字符a,或非字符b,或非字符c的任意一个字符
  • 字符类:[a-zA-Z]
     含义: 代表的是a 到 z 或 A 到 Z,两头的字母包括在内
     例:  匹配规则为"[a-zA-Z]",那么匹配的是一个大写或者一个小写字母字符
  • 字符类:[0-9]
     含义: 代表的是 0到9数字,两头的数字包括在内
     例:  匹配规则为"[0-9]",那么匹配的是一个数字
  • 字符类:[a-zA-Z0-9_]
     含义: 代表的是字母或者数字或者下划线
     例:  匹配规则为" [a-zA-Z_0-9] ",那么匹配的是一个字母或者是一个数字或一个下划线
  • 边界匹配符:^/$
     含义: 代表的是行的开头/结尾
     例:  匹配规则为^[abc][0-9]$,表示:必须以a,b,c三个字符的其中一个开头;以0-9中其中一个结尾,并且该字符串只能是两位
String pattern = "^[abc][0-9]$";
String srt1 = "a5";
boolean isMatch1 = Pattern.matches(pattern, srt1);
System.out.println("str1匹配结果:"+isMatch1);
// str1匹配结果:true
String srt2 = "af";
boolean isMatch2 = Pattern.matches(pattern, srt2);
System.out.println("str2匹配结果"+isMatch2);
// str2匹配结果:false
String srt3 = "afg5";
boolean isMatch3 = Pattern.matches(pattern, srt3);
System.out.println("str3匹配结果"+isMatch3);
// str3匹配结果:false
  • 数量词:X?
     含义: 代表的是X出现一次或一次也没有
     例:  匹配规则为"a?",表示该字符以a开头,并且a出现一次或0次。(要么是"a",要么为"",如果有多个字符或者是其他单字符,都为false)
String pattern = "a?";
String srt1 = "a";
boolean isMatch1 = Pattern.matches(pattern, srt1);
System.out.println("str1匹配结果:"+isMatch1);
// str1匹配结果:true
String srt2 = "";
boolean isMatch2 = Pattern.matches(pattern, srt2);
System.out.println("str2匹配结果:"+isMatch2);
// str2匹配结果:true
String srt3 = "f";
boolean isMatch3 = Pattern.matches(pattern, srt3);
System.out.println("str3匹配结果:"+isMatch3);
// str3匹配结果:false
  • 数量词:X+
     含义: 代表的是X出现一次或多次
     例:  匹配规则为"fa+",表示该字符以f开头,并且a出现一次或多次
String pattern = "fa+";
String srt1 = "faa";
boolean isMatch1 = Pattern.matches(pattern, srt1);
System.out.println(isMatch1);// 输出:true
String srt2 = "aa";
boolean isMatch2 = Pattern.matches(pattern, srt2);
System.out.println(isMatch2);// 输出:false
String srt3 = "fafa";
boolean isMatch3 = Pattern.matches(pattern, srt3);
System.out.println(isMatch3);// 输出:false
String srt4 = "f";
boolean isMatch4 = Pattern.matches(pattern, srt4);
System.out.println(isMatch4);// 输出:false
  • 数量词:X*
     含义: 代表的是X出现零次或多次
     例:  匹配规则为"fa*" ,表示该字符以f开头,并且a出现0次或多次

限定符

字符 描述
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。
  • | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
  • | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
    {n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
    {n,} | n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
    {n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

非打印字符

  非打印字符也是正则表达式的组成部分。下表列出了一些非打印字符:

字符 描述
     \f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\s 匹配任何空白字符,包括空格、制表符、换页符等。等价于[\f\n\r\v\t]。PS:Unicode正则表达式会匹配全角空格符
\S 匹配任何非空白字符,等价于[^\f\n\r\v\t]。PS:与\s相反
\t 匹配一个制表符。
\v 匹配一个垂直制表符。
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
例如:
  • 字符:\t
     含义: 制表符
     例:  效果是产生一个制表符的空间
  • 字符:\n
     含义: 换行符
     例:  效果是换行,光标在原有位置的下一行
  • 字符:\r
     含义: 回车符
     例:  效果是回车后的效果,光标来到下一行行首

java使用正则简单示例

字符串类中涉及正则表达式的常用方法

/**
 *    matches(String regex):判断字符串是否匹配给定的规则
 *    校验qq号码.规则:[1-9][0-9]{4,14}
 *    1: 要求必须是5-15位数字
 *    2: 0不能开头
 */
public void matchesTest(){
    String qq = "604154942";
    String regex = "[1-9][0-9]{4,14}";
    boolean flag = qq.matches(regex);
}
/**
 *    split(String regex):根据给定正则表达式的匹配规则,拆分此字符串
 *    分割出字符串中的的数字:_
 *    通过"_"拆分
 */
public void splitTest01(){
    String s = "18-22-40-65";
    String regex = "-";
    String[] result = s.split(regex);
    System.out.println(result);//[18,22,40,65]15 }
/**
 *    按空格分割出字符串中的的数字: +
 *    18    22      40            65
 *    注意:当有多个空格的时候,正则条件不能单纯的写成“ ”(空格),这样只会匹配一个空格,切出来的数据不符合我们要求,
 *    要写成“ +”("空格+"),+表示匹配一个或多个
 */
public void splitTest02(){
    String s = "18    22      40            65";
    String regex = " +";
    String[] result = s.split(regex);
    System.out.println(result);//[18,22,40,65]
}
/**
 *    切IP地址:“\\.”
 */
public void splitTest03(){
    Spring ip = "127.0.0.1";
    // "."在正则中有特殊含义,通过转译符"\"将其转译
    Spring regex = "\\.";
    Spring[] result = ip.split(regex);    
}
/**
 *    replaceAll(String regex,String replacement):将符合规则的字符串内容,全部替换为新字符串
 *    将数字替换成#号
 */
public void replaceAllTest01(){
    String s = "Hello12345World6789012";
    // "\\d"匹配的是一个位置是否为数字
    String regex = "[\\d]";
    String result = s.replaceAll(regex, "#");
    System.out.println(result); // 结果是:Hello#####World#######
}
/**
 *    将数字替换成一个#号
 */
public void replaceAllTest02(){
    String s = "Hello12345World6789012";
    // "\\d"匹配的是一个位置是否为数字,+表示一个或多个,注意+不能写[]里面
    String regex = "[\\d]+";
    String result = s.replaceAll(regex, "#");
    System.out.println(result); // 结果是:Hello#World#

常用正则表达式

一、校验数字的表达式

  • 数字:^[0-9]*$
  • n位的数字:^\d{n}$
  • 至少n位的数字:^\d{n,}$
  • m-n位的数字:^\d{m,n}$
  • 零开头的数字:^(0[0-9]*)$
  • 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
  • 带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})$
  • 正数、负数、和小数:^(-|+)?\d+(.\d+)?$
  • 有两位小数的正实数:^[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)$ 或
    ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$
  • 浮点数:^(-?\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]+$
  • 可以输入含有%&',;=?$"等字符:[%&',;=?$\x22]+
  • 禁止输入含有~的字符:[^~\x22]+

三、特殊需求表达式

  • 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-./?%&=]*)?$

  • 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

  • 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$

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

  • 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号):
    ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)

  • 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(\d{15}$)|(\d{18}$)|(^\d{17}(\d|X|x)$)

  • 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

  • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$

  • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10
    之间):^(?=.\d)(?=.[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$

  • 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.\d)(?=.[a-z])(?=.*[A-Z]).{8,10}$

  • 日期格式:^\d{4}-\d{1,2}-\d

  • 一年的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)$

  • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$

  • 空白行的正则表达式:\n\s*\r (可以用来删除空白行)

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

  • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)

  • IP地址:((?: (?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))

😃😃 持续更新ing 😃😃 如有异常,请留言通知

posted @ 2020-05-06 21:27  喝咖啡的睡眠族  阅读(409)  评论(0编辑  收藏  举报