正则表达式
一.概念
是指一个用来描述或者匹配一系列符合某个规则的字符串的单个字符串,其实就是一种规则,有自己特殊的应用;
作用:比如注册邮箱,邮箱有账号和密码,一般会对其限制长度,这个限制长度的事情,就是正则表达式做的
例:检验QQ号码:
*1.要求必须是5-15位的数字
*2.要求不能以0开头
*3.要求全是数字组成
方法一:使用非正则表达式完成
public class Demo18 {
public static void main(String[] args){
System.out.println(CheckQQ("12312321312"));
}
public static boolean CheckQQ(String qq){
boolean flag = true;
if(qq.length()>=5&&qq.length()<=15){ //判断是否是5-15个数字
之间
if(!qq.startsWith("0")){ //判断是否以"0"开头
char arr[] = qq.toCharArray(); //字符串转字符数组
for (int i = 0; i < arr.length; i++) {
if(arr[i]>='0'&&arr[i]<='9'){ //判断是否是0-9数 字组成
break;
}else{
flag = false;
break;
}
}
}else{
flag = false;
}
}else{
flag = false;
}
return flag;
}
方法二:使用正则表达式
public static void main(String[] args){
String regex="[1-9]\\d{4,14}";//[1-9]表示第一位,\\d表示0-9的字 符,{4,14}表示0-9出现的次数为4-14次
System.out.print("12312312".matches(regex));//"12312312".matches(reg ex)检测是否匹配规则,并返回比尔类型的值
}
字符类 |
|
[abc] |
a、b 或 c(简单类) |
[^abc] |
任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] |
a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] |
a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] |
d、e 或 f(交集) |
[a-z&&[^bc]] |
a 到 z,除了 b 和 c:[ad-z](减去)(补集) |
[a-z&&[^m-p]] |
a 到 z,而非 m 到 p:[a-lq-z](减去)(补集) |
[]代表单个字符
预定义字符类 |
|
. |
任何字符(与行结束符可能匹配也可能不匹配)(一个点表示一个字符) |
\d |
数字:[0-9] |
\D |
非数字: [^0-9] |
\s |
空白字符:[ \t\n(换行)\x0B\f\r(回车)] |
\S |
非空白字符:[^\s] |
\w |
单词字符:[a-zA-Z_0-9] 字母,下划线和数字,单字符 |
\W |
非单词字符:[^\w] |
[]代表单个字符
Greedy 数量词 |
|
X? |
X,一次或一次也没有 |
X* |
X,零次或多次 |
X+ |
X,一次或多次 |
X{n} |
X,恰好 n 次 |
X{n,} |
X,至少 n 次 |
X{n,m} |
X,至少 n 次,但是不超过 m 次 |
二.正则表示式分割字符串
例:
public class Demo_split {
public static void main(String[] args){
String str="金三胖 郭美美 李dayone";
String[] arr = str.split(" "); //正则表达式切割并保存到String字符 串数组中
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
例:我有字符串”91 27 46 38 50”,请写出代码实现最终功能:”27 38 46 50 91”
public static void main(String[] args){
String str = "91 27 46 38 50";
//1.先分割成字符,并存储到数组中
String[] sArr = str.split(" ");
//2.定义一个int数组,与sArr等长
int[] arr = new int[sArr.length];
//3.将字符数组转换成数字数组,并储存到arr中
for (int i = 0; i < arr.length; i++) {
arr[i]=Integer.parseInt(sArr[i]);
}
//4.将int数组进行排序
Arrays.sort(arr);
//将 转换后的int数组转换成String类型的字符串
StringBuilder a = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
if(i==arr.length-1){
a.append(arr[i]);
}else{
a.append(arr[i]+" ");
}
}
System.out.println(a.toString());
}
三.正则表达式替换功能
replaceAll(String regex,String replacement)
String str = “wo1aihei2ma”;
String regex = “\\d”; // \\d表示任意数字
String str2 = str.replaceAll(regex,””);
四.正则表达式的分组功能
例:
我....我...我.我...要....要...要.要...学....学...学.学...编....编...编....编...程.程...程.程...
将字符串还原成:我要学编程
String str = "我....我...我.我...要....要...要.要...学....学...学.学...编....编...编....编...程.程...程.程...";
//第一次进行替换,替换所有的.,\\.表示".","+"表示出现1次或者多次
String str1 = str.replaceAll("\\.+","");
System.out.println(str1);
//第二次进行替换,先将原字符串分组,(.)表示分组,"."表示任意字符,"\\1+"表示出现一次或者多次,"$1"表示拿到每组的第一个字符
String str2 = str1.replaceAll("(.)\\1+", "$1");
System.out.println(str2);
五.正则表达式的获取功能
例:
String str = "我现在的手机号码是15999107721,以前用过18841847521,还用过13550836011";
String regex = "1[358]\\d{9}";
Pattern p = Pattern.compile(regex);
Matcher m=p.matcher(str);
while(m.find())
System.out.println(m.group());