正则表达式
正则表达式
JAVA版
单个符号
1、英文句点.符号:匹配单个任意字符。
- 表达式
t.o可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。
2、中括号[]:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。
- 表达式:
t[abcd]n只可以匹配:tan,tbn,tcn,tdn。不可以匹配:thn,tabn,tn等。
3、| 符号。相当于“或”,可以匹配指定的字符,但是也只能选择其中一项进行匹配。
- 表达式:
t(a|b|c|dd)n只可以匹配:tan,tbn,tcn,tddn。不可以匹配taan,tn,tabcn等。
4、表示匹配次数的符号
| 符号 | 次数 |
|---|---|
* |
零次或者多次, 克林闭包, * 等价于 |
+ |
一次或者多次, 正闭包, + 等价于 |
? |
零次或者一次, ? 等价于 |
{n} |
恰好n次 |
{n,m} |
从n次到m次 |
- 表达式:
[0—9]{3}\—[0-9]{2}\—[0-9]{3}的匹配格式为:999-99-999因为-符号在正则表达式中有特殊的含义,它表示一个范围,所以在前面加转义字符\。
5、^符号:
- 限定开头:
- 匹配后面紧跟的字符为开头的字符(
[ ]之外或数字、元字符之前),^[0-9],含义为以0-9中的数字为第一个数字开头,[^x]第一个字符不能是x。
- 否 ( 取反 ) :
- 当这个字符出现在一个字符集合模式(
[ ]之内)的第一个字符时,表示为取反。如[^0-9],表示为匹配除了数字以外的字符。
6、$符号:
表示从字符串末尾进行匹配。
如/^[0-9]{8}$/,表示为字符串以数字为结尾字符。
7、\S符号:非空字符
8、\s符号:空字符,只可以匹配一个空格、制表符、回车符、换页符,不可以匹配自己输入的多个空格。
9、\r符号:空格符,与\n、\tab相同
()和[]有本质的区别
()内的内容表示的是一个子表达式,()本身不匹配任何东西,也不限制匹配任何东西,只是把括号内的内容作为同一个表达式来处理,例如(ab){1,3},就表示ab一起连续出现最少1次,最多3次。如果没有括号的话,ab{1,3},就表示a,后面紧跟的b出现最少1次,最多3次。[]表示匹配的字符在[]中,并且只能出现一次,并且特殊字符写在[]会被当成普通字符来匹配。例如[(a)],会匹配(、a、)、这三个字符。
常用的正则表达式
1、Java:
(([a-z]|_)(\\w*)){6,20}
匹配以字母或下划线开头,字母数字下划线结尾的字符串
2、JavaScript:
/^(\-?)(\d+)$/匹配数字
3、JavaScript:
/^\w+$/匹配字母数字下划线。
Java 中正则表达式的应用
1、判断功能
public boolean matches(String regex)
// 案例:判断录入的手机号是否为13或者18开头
public class RegexDm {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入手机好:");
String s = sc.nextLine();
String regex = "1[38]\\d{9}"; //定义手机好规则
boolean flag = s.matches(regex); //判断功能
System.out.println("flag:"+flag);
}
}
2、分割功能
public String[] split(String regex)
public class RegexDm {
public static void main(String[] args){
String age = "18-24"; //定义年龄范围
String regex = "-";
//分割成字符串数组
String[] strArr = age.split(regex);
int startAge = Integer.parseInt(strArr[0]);
int endAge = Integer.parseInt(strArr[1]);
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的年龄:");
int a = sc.nextInt();
if (a >= startAge && a <= endAge){
System.out.println("你就是我想找的");
}else{
System.out.println("滚");
}
}
}
3、替换功能
public String replaceAll(String regex,String replacement)
public class RegexDm {
public static void main(String[] args){
String s = "12342jasfkgnas234";
//把字符串里面的数字替换成*
String regex = "\\d";
String ss = "*";
String result = s.replaceAll(regex,ss);
System.out.println(result);
}
}
字符符号
| 字符 | 作用 |
|---|---|
. |
匹配任意一个字符 ( 除了\n ) |
[] |
匹配[]中列举的字符 |
[^...] |
匹配不在[]中列举的字符 |
\d |
匹配数字, 0到9, 等价于[0-9] |
\D |
匹配非数字 |
\s |
匹配空白, 就是空格和tab, 仅匹配一个空格、\t、\n、换页符 |
\S |
匹配非空白 |
\w |
匹配字母数字或下划线字符, [a-zA-Z0-9_] |
\W |
匹配非字母数字或下划线字符 |
- |
匹配范围, 比如[a-f] |
常用的正则表达式
一、校验数字的表达式
-
数字:
^[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})?$ -
正数、负数、和小数:
^(\-|\+)?\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]+$或^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$ -
可以输入含有
^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 12禁止输入含有~的字符:[^~\x22]+
其它:
.*匹配除 \n 以外的任何字符。
/[\u4E00-\u9FA5]/ 汉字
/[\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-./?%&=]*)?$ -
密码:
^[a-zA-Z]\w{5,17}$// 字母开头,长度在6~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)$ -
xml文件:
^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$ -
空白行的正则表达式:
\n\s*\r(可以用来删除空白行) -
校验日期:
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$(“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。)
需要注意的点
| 元字符 | 描述 |
|---|---|
| x|y | 匹配x或y。例如,`z |
| [xyz] | 字符集合。匹配所包含的任意一个字符。例如,[abc]可以匹配“plain”中的“a”。 |
| [^xyz] | 负值字符集合。匹配未包含的任意字符。例如,[^abc]可以匹配“plain”中的“plin”任一字符。 |
| [a-z] | 字符范围。匹配指定范围内的任意字符。例如,[a-z]可以匹配“a”到“z”范围内的任意小写字母字符。注意:只有连字符在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身。 |
| [^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如,[^a-z]可以匹配任何不在“a”到“z”范围内的任意字符。 |
| \b | 匹配一个单词的边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”;“\b1_”可以匹配“1_23”中的“1_”,但不能匹配“21_3”中的“1_”。 |
| \B | 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。 |
| \cx | 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。 |
| \d | 匹配一个数字字符。等价于[0-9]。grep 要加上-P,perl正则支持 |
| \D | 匹配一个非数字字符。等价于[^0-9]。grep要加上-P,perl正则支持 |
| \f | 匹配一个换页符。等价于\x0c和\cL。 |
| \n | 匹配一个换行符。等价于\x0a和\cJ。 |
| \r | 匹配一个回车符。等价于\x0d和\cM。 |
| \s | 匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 |
| \S | 匹配任何可见字符。等价于[^ \f\n\r\t\v]。 |

浙公网安备 33010602011771号