-
-
- 概述及基本使用
- 正则表达式的组成规则
- 正则表达式的应用
- 判断功能String 类
- 分割功能String 类
- 替换功能String 类
- 获取功能Pattern和Matcher类的使用
- 常用正则表达式整理
- 校验数字的表达式
- 校验字符的表达式
- 特殊需求表达式
- 运算符优先级
概述及基本使用
public static boolean checkQQ(String qq) {
return qq.matches("[1-9]d{4,14}");
}
正则表达式的组成规则
- 规则字符在
java.util.regex Pattern
类中
常见组成规则
- 通配符
: 引用符,用来表示某些特殊字符本身。
.
: 匹配除rn
之外的任何单个字符。如果要表达.
字符本身,用 .
表示。最终输入的效果为.
b
: 匹配单词边界,即 不是单词字符的地方。
B
: 匹配b
之外的任意字符。
n
:匹配换行符 (‘u000A’)
r
:匹配回车符 (‘u000D’)
t
:匹配制表符 (‘u0009’)</li>
<li>
d:匹配[0-9]任意一个数字</li>
<li>
D:匹配非数字与
[^0-9]相同</li>
<li>
w:匹配包括下划线在内的任意单词字符
[a-zA-Z_0-9]
<ul><li>在正则表达式里面组成单词的东西必须有这些东西组成</li></ul></li>
<li>
W: 匹配非单词字符:
[^w]</li>
<li>
s`: 匹配任何不可见字符,包括空格、制表符、换页符等等。
边界匹配器
字符类
[abc]
: a、b 或 c(简单类)
[^abc]
: 任何字符,除了 a、b 或 c(否定)
[a-zA-Z]
: a到 z 或 A到 Z,两头的字母包括在内(范围)
[x|y]
: 匹配X或y
[0-9]
: 0到9的字符都包括
数量词
X?
: X 匹配 零次或一次
X*
: X 匹配 零次或多次
X+
: X 匹配 一次或多次
X{n}
: X 匹配 恰好 n 次
X{n,}
: X 匹配 至少 n 次
X{n,m}
: X 匹配 至少 n 次 匹配 至多 m 次
非贪婪匹配
- 在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配
*?
重复任意次,但尽可能少重复
+?
重复1次或更多次,但尽可能少重复
??
重复0次或1次,但尽可能少重复
{n,m}?
重复n到m次,但尽可能少重复
{n,}?
重复n次以上,但尽可能少重复
非获取匹配
(?:pattern)
: 匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
(?=pattern)
: 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)
: 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern)
: 反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern)
: 反向否定预查,与正向否定预查类似,只是方向相反。例如“(?
正则表达式的应用
判断功能(String
类)
- public boolean
matches
(String regex)
- 手机号码练习:
public class PhoneNumber {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Pleas input you phonenumber:");
String phone = sc.nextLine();
String regex = "1[38]d{9}";
boolean flag = phone.matches(regex);
System.out.println("The Phone Number is:"+flag);
}
}
public class RegexTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入邮箱:");
String email = sc.nextLine();
String regex = "w+@w{2,6}(.w{2,3})+";
boolean flag = email.matches(regex);
System.out.println("flag:"+flag);
}
}
分割功能(String
类)
public class RegexDemo {
public static void main(String[] args) {
String ages = "18-24";
String regex = "-";
String[] strArray = ages.split(regex);
int startAge = Integer.parseInt(strArray[0]);
int endAge = Integer.parseInt(strArray[1]);
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
if(age>=startAge && age<=endAge) {
System.out.println("你就是我想找的");
}else {
System.out.println("不符合我的要求,gun");
}
}
}
public class RegexDemo2 {
public static void main(String[] args) {
String s1 = "aa,bb,cc";
String[] str1Array = s1.split(",");
for (int x = 0; x < str1Array.length; x++) {
System.out.println(str1Array[x]);
}
System.out.println("---------------------");
String s2 = "aa.bb.cc";
String[] str2Array = s2.split(".");
for (int x = 0; x < str2Array.length; x++) {
System.out.println(str2Array[x]);
}
System.out.println("---------------------");
String s3 = "aa bb cc";
String[] str3Array = s3.split(" +");
for (int x = 0; x < str3Array.length; x++) {
System.out.println(str3Array[x]);
}
System.out.println("---------------------");
String s4 = "E:JavaSEday14avi";
String[] str4Array = s4.split("\");
for (int x = 0; x < str4Array.length; x++) {
System.out.println(str4Array[x]);
}
System.out.println("---------------------");
}
}
public class RegexTest {
public static void main(String[] args) {
String s = "91 27 46 38 50";
String[] strArray = s.split(" ");
int[] arr = new int[strArray.length];
for (int x = 0; x < arr.length; x++) {
arr[x] = Integer.parseInt(strArray[x]);
}
Arrays.sort(arr);
StringBuilder sb = new StringBuilder();
for (int x = 0; x < arr.length; x++) {
sb.append(arr[x]).append(" ");
}
String result = sb.toString().trim();
System.out.println("result:"+result);
}
}
替换功能(String
类)
- public String
replaceAll
(String regex,String replacement)
public class RegexDemo {
public static void main(String[] args) {
String s = "helloqq12345worldkh622112345678java";
String regex = "d+";
String ss = "";
String result = s.replaceAll(regex,ss);
System.out.println(result);
}
}
获取功能(Pattern和Matcher类的使用)
- Pattern和Matcher类的使用
模式和匹配器的基本使用顺序
- step1: 把正则表达式编译成
模式对象
- Pattern p = Pattern.compile(“a*b”);
- step2: 通过模式对象得到匹配器对象,这个时候需要的是被匹配的字符串
- Matcher m = p.matcher(“aaaaab”);
- step3: 调用匹配器对象的功能
find():查找存不存在
- group():获取刚才查找过的数据
public class RegexDemo {
public static void main(String[] args) {
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
System.out.println(b);
String s = "aaaaab";
String regex = "a*b";
boolean bb = s.matches(regex);
System.out.println(bb);
}
}
public class RegexDemo2 {
public static void main(String[] args) {
String s = "da jia ting wo shuo,gao xing bu?";
String regex = "bw{3}b";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group());
}
}
}
常用正则表达式整理
校验数字的表达式
- 数字:
^[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]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)$
校验字符的表达式
- 汉字:
^[u4e00-u9fa5]{0,}$
- 英文和数字:
^[A-Za-z0-9]+$
- 长度为3-20的所有字符:
^.{3,20}$
- 由26个英文字母组成的字符串:
^[A-Za-z]+$
- 由26个大写英文字母组成的字符串:
^[A-Z]+$
- 由26个小写英文字母组成的字符串:
^[a-z]+$
- 由数字和26个英文字母组成的字符串:
^[A-Za-z0-9]+$
- 由数字、26个英文字母或者下划线组成的字符串:
^w+$
- 中文、英文、数字包括下划线:
^[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}$
- 国内电话号码(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}?$
- 帐号是否合法(字母开头,允许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]).{8,10}$
- 腾讯QQ号:
[1-9][0-9]{4,}
(腾讯QQ号从10000开始)
- 中国邮政编码:
[1-9]d{5}(?!d)
(中国邮政编码为6位数字)
- IP地址:
d+.d+.d+.d+
(提取IP地址时有用)
- IP地址:
((?:(?:25[0-5]|2[0-4]d|[01]?d?d).){3}(?:25[0-5]|2[0-4]d|[01]?d?d))
运算符优先级
运算符 |
描述 |
|
转义符 |
(),(?:),(?=),[] |
圆括号和方括号 |
*,+,?,{n},{n,},m} |
限定符 |
^,$,任何元字符、任何字符 |
定位点和序列(即:位置和顺序) |
* |
: 替换”或”操作 字符具有高于替换运算符的优先级,使得 m|food
匹配”m”或”food”。若要匹配”mood”或”food”,请使用括号创建子表达式,从而产生(m|food)
。