【特殊字符】
\d //数字0–9 (由一位数字组成的字符串)
\D //任意一个非数字字符
. //任意一个字符
\s //空白字符 空格 tab 回车 等
\S //非空白字符
\w //表示所有单词字符 包括0-9 26个英文字母和 _
\W //表示非单词字符
【表示范围的符号】
- //几次都行
- //至少一次
? //至多一次(0或1)
[] 开始和结束的位置
{} 出现的次数
() 表示子表达式开始和结束的位置
\d{6} 必须为6次数字
\d{6,10} 6至10位,包括10位数字
\d{6,} 至少10位
[0-9] 等同于\d
[0-9]{2} 数字出现2次
[a-z]{6} a-z出现6次
[a-zA-Z]{6} 6个字母忽略大小写
[abc] abc任选一个
1 以A或者B开头
[^AB] 表示AB不能为开头
[a-z&&[def]] 表示a-z和def的交集 即 def
“hi." 和 “high” 匹配
"ahi.” 和 “ahigh” 匹配
"a.hi.*"和 “axhigh” 匹配
\b --------\W表示的字符可以做单词边界
但 “a.\bhi." 和 “axhigh” 不匹配
"a.\bhi.” 和 “a high” 就匹配 为什么?
因为\b表示单词的边界 空格把 a 和high分成了两个单词
也就是说 high是另一个单词的开始 处在边界上
所以就匹配 而x不会把a和high分成两个单词
/*
匹配:实际上使用的是String中的boolean matches(String regex)方法 ,判读一个字符串是否匹配某个正则表达式
切割:实际上使用的是String中的String[] split(String regex)
替换:实际上使用的是String中的String replaceAll(String regex, String replacement)
把字符串中符合正则表达式的都替换为第二个参数
获取:把正则表达式转换成Pattern类型的对象
使用Pattern对象的matcher方法得到Matcher对象
*/
=====================================================================================
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Demo11
{
public static void main(String[] args)
{
//piPei();
//qieGe();
//tiHuan();
huoQu();
}
//【匹配】验证手机号
public static void piPei(){
String phone="12838384444";
String regex="1[38576]\\d{9}";
boolean b = phone.matches(regex);
sop(b);
}
public static void sop(Object obj){
System.out.println(obj);
}
}
//【获取】
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Test{
public static void main(String[] args){
String str="aaa abcd axss xssdf";
//1定义一个正则表达式;
String regex="\\b[a-z]{4}\\b";
//2使用Pattern把regex编译成一个正则(compile就是编译的意思)
Pattern p=Pattern.compile(regex);
//3使用Patter创建Matcher,建立字符串与正则之间的练习
Matcher m=p.matcher(str);
while(m.find()){ //m.find 从str中是否找到符合regex的字串
System.out.println(m.group()); //m.group() 获取到符合条件的字串
}
}
}
//【替换】
public static void tiHuan(){
//String str="zhangsanxxxxxxxxlisi**********zhaoliu$$$$$$$$$$$$$$wangwu";
//String regex = "(.)\\1+";
//String str="lskdjflksd9283749837493lsjdflskjdf098409283409wehro564321980";
//String regex = "\\d{8,}";
String str="13533337777";
String regex="(\\d{3})\\d{4}(\\d{4})";
String ss = str.replaceAll(regex,"$1****$2");//$1表示取第一组的值 在正则表达式外用$1表示第一组
sop(ss);
}
//【切割】
public static void qieGe()
{
//String str="zhangsan.lisi.zhaoliu.wangwu";
//String regex="\\.";//表示字符点
//String str="zhangsan lisi zhaoliu wangwu";
//String regex=" +";
String str="zhangsanxxxxxxxxlisi**********zhaoliu$$$$$$$$$$$$$$wangwu";
String regex="(.)\\1+"; //第二位和第一组的值是一样的,一个正则表达式可以包括多组,从左到右依次是第一组,第二组
//在正则表达式里面第一组就用\\1表示。
String[] arr = str.split(regex);
for(int i=0;i<arr.length;i++){
sop(arr[i]);
}
}
========================================================================================================================================
import java.util.Arrays;
class Test2
{
public static void main(String[] args)
{
// 练习2:对ip地址按照数值顺序排序。192.168.1.200 10.10.10.10 4.4.4.4 127.0.0.1
String str = "192.168.1.200 10.10.10.10 4.4.4.4 127.0.0.1";//"192.168.001.200 010.010.010.010 004.004.004.004 127.000.000.001";
//统一补两个0
String s1=str.replaceAll("(\\d{1,3})","00$1");
System.out.println(s1);//1至3位数字,设置成一个组。 在这个组前面加上两个0.
//统一弄成3位的
String s2=s1.replaceAll("0*(\\d{3})","$1");
System.out.println(s2); //任意个0,后面的三个数设成一组。 只留下后面只有三个数的组。
//切割出四个ip地址
String[] ips =s2.split(" +");
//至少一个空格 进行切割
//按字符串大小排序
Arrays.sort(ips);
for(int i=0;i<ips.length;i++){
System.out.println(ips[i].replaceAll("0*(\\d{1,3})","$1"));
} //任意个数的0,后面至少一个数,设置成一组。 只留下这个组。
//练习1:我我..我我..我.我要...要要...要要...要学学....学学学...编编...编编..编程...程程...程程..程.程
//要求,转成:我要学编程。
/*
String str = "我我..我我..我.我要...要要...要要...要学学....学学学...编编...编编..编程...程程...程程..程.程";
String ss = str.replaceAll("\\.+",""); //选中至少一个点,转变成无。
//这里一定要使用双斜杠进行转义,因为.表示任意字符,直接使用.进行替换不会有任何的变化
String s2=ss.replaceAll("(.)\\1+","$1");//任意字符的一个组,// 任意字符的一个组1 \\1表示第二位置上 重复组1 至少一次。 全部换成组1
System.out.println(s2);*/
}
}
class Test3
{
public static void main(String[] args)
{
String email=0lisi_hehe@qq.com.cn;
String regex=[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-z]+){1,2};
}
}
AB ↩︎