正则表达式
一、概述
正则表达式是符合一定规则的字符串表达式。有特殊的应用场景。
虽然正则表达式是简化了,但是阅读性变差。
如进行QQ号的校验,要求长度为5-15位,只能是数字,0不能开头。普通的方式为:
private static void checkQQ(String qq) {
int len = qq.length();
//判断位数是否符合要求
if(len >= 5 && len <= 15){
//不能以0开头
if(!qq.startsWith("0")){
try {
long l = Long.parseLong(qq);
System.out.println(l+"正确");
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.println(qq+"含有非法字符");
}
}else{
System.out.println(qq+"不能以0开头");
}
}else{
System.out.println(qq+"长度错误");
}
}
而是用正则表达式后如下:
String qq = "12345685";
String regex = "[1-9][0-9]{4-14}";//第一位为1-9的数字,接下来0-9出现4到14次
boolean b = qq.matches(regex);
System.out.println(qq+":"+b);
二、正则的用法
我们先看一看正则表达式的一些规则:
A:特殊字符
\\:反斜线
\r:回车
\n:换行
B:字符类
[abc]:a,b或者c的任意一个。
[^abc]:除了a,b,c以外的字符。
[a-zA-Z]:包括了26个英文字母。
[0-9]:包括了0-9这个10个数字字符。
C:预定义字符类
. 任意字符
\d 数字[0-9]
\D 非数字[^0-9]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
E:Greedy数量词
x? 0次或1次
x* 0次或多次
x+ 1次或多次
x{n}恰好n次
x{n,}至少n次
x{m,n}至少m次,但不能超过n次
按照这些规则,能够读懂别人的正则表达式即可。
简单的常见最好会写。
知道一些规则后,就是常见操作。正则表达式的常见操作有四类:
1.匹配:其实就是使用String类中的matches方法。
2.切割:其实就是使用String类中的split方法。
3.替换:其实就是使用String类中的replaceAll方法。
4.获取:将字符串中的符合规则的子串取出。
1.匹配
//匹配手机号
//假设手机号已有 13xxxxxxxxx 15xxxxxxxxx 18xxxxxxxxx
public static void method(){
String tel = "13055526556";
//第一位是1,第二位是3,5,8之一,后面的9位是0-9之间的任意数字
String regex = "1[358]\\d{9}";
System.out.println(tel.matches(regex));
}
只有当号码满足上述要求才能返回true否则返回false。
2.切割
//切割
public static void split(String str , String regex){
String[] arr = str.split(regex);
for(String s:arr){
System.out.println(s);//遍历后打印
}
}
主函数中:
String str = "sjdjjnlvvnsklnaaaaixmmmmmmxi";
//按照叠词完成切割。为了可以让规则的结果被重用
//可以将规则封装成一个组。用()完成。组的出现都有编号。
//从1开始。 想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。
String regex = "(.)\\1+";
split(str ,regex);
//按照点进行切割
split("sdhjk.sdbj.shc","\\.");
//按照\进行切割
split("C:\\hah\\sdhj\\sdj",<a>\\\\</a>);
3.替换
//替换
public static void replace(String str, String regex, String newStr){
str = str.replaceAll(regex,newStr);
System.out.println(str);
}
主函数中:
//将字符串中至少出现5次的数字替换成*
String str = "sbjnav15227866zbxciv561ijn";
replace(str,"\\d{5,}","*");
//将叠词替换成一个字符-->dnionsioicjvsdsa
String str = "dnionsioiicjvvvvsdssaaaa";
replace(str,"(.)\\1+","$1");
其中$表示:如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
4.获取
public static void get(){
String str = "haods asdav sdj asdj sdo dhja ocmed snkd";
//取出所有由四个字母组成的单词
String regex = "\\b[a-z]{4}\\b";
//将规则封装成对象
Pattern p = Pattern.compile(regex);
//创建匹配给定输入与此模式的匹配器。
Matcher m = p.matcher(str);
while (m.find())
{
System.out.println(m.group());
}
}
操作步骤:
1)将正则表达式封装成对象。
2)让正则对象和要操作的字符串相关联。
3)关联后,获取正则匹配引擎。
4)通过引擎对符合规则的子串进行操作,比如取出。
三、思路方式
1,如果只想知道该字符是否对是错,使用匹配。
2,想要将已有的字符串变成另一个字符串,替换。
3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。