黑马程序员——正则表达式
来源:互联网 发布:html5动画源码 编辑:程序博客网 时间:2024/06/07 05:00
——- android培训、java培训、期待与您交流! ———
正则表达式:符合一定规则的表达式
正则表达式是Java处理字符串、文本的重要工具
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
好处:可以简化对字符串的复杂操作
弊符号定义越多,正则越长,阅读性越差
java.util.regex.Matcher 模式类:用来表示一个编译过的正则表达式。
java.util.regex.Pattern 匹配类:用模式匹配一个字符串所表达的抽象结果。
1、Java对反斜线处理的问题
在其他语言中,\表示要插入一个字符\;
在Java语言中,\表示要插入正则表达式的反斜线,并且后面的字符有特殊意义。
在Java正则表达式中,如果要插入一个\字符,则需要在正则表达式中写成\\
如果在正则表示式中表示回车换行等,则不需要多添加反斜线了。比如回车\r就写作\r.
组概念,组是用括号划分的正则表达式,可以通过编号来引用组。组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。
例如:A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;
A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。
常用预定义字符
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
常见的操作思路:
1.如果只想知道字符串是对是错,使用匹配
2.想要将已有的字符串变成另一个字符串。替换
3.想要按照自定的方式将字符串变成多个字符串。切割,获取规则一维的字串。
4.想要拿到符合需求的子串,获取,获取符合规则的字串
常见具体操作:
1:匹配:String matches方法。用规则匹配整个字符串,只要一处不符合规则,就匹配结束,返回false
2.切割: String split();
3.替换:String replaceAll();
4.获取:
匹配示例:
检索邮箱名称。手机号码。QQ号码等等输入是否符合规则
{ public static void main(String[] args) { //checkQQ1(); //Demo(); //splitDemo(); //splitDemo("c:\\abc\\a.txt","\\\\"); //splitDemo("erkkbsycqqdfkkscmf","(.)\\1");//按照叠词完成切割。为了让规则的结果可以被重用 //可以将规则封装成一个组,用()完成。组的出现都有编号 //从1开始。想要使用已有的组可以通过\n(n就是编号)的形式来获取。 //(.)重用的部分用小括号括起来,就是封装成一个组。 //(.)\1//第一位的内容在第二位又出现了 String str="wer027354850274850tymen950";//将字符串中的数字替换成# replaceAllDemo(str,"\\d{5,}","#");//5个以上的数字替换成一个#号 String str2="rekkygggmksbfuyyzzn";//将叠词替换成一个字符* replaceAllDemo(str2,"(.)\\1+","*"); replaceAllDemo(str2,"(.)\\1+","$1");//将重叠的字符替换成单个字母 } public static void replaceAllDemo(String str,String reg,String newStr) { str=str.replaceAll(reg,newStr); System.out.println(str); } public static void splitDemo(String str,String reg) { //String str="zhangsan lisi wangwu"; //String reg=" +";//多个空格 //String reg="\\."//正则表达式里面的.,按照。来切割 String[] arr=str.split(reg); for(String s:arr) { System.out.println(s); } } /* 匹配 手机号段: 13xxx,15xxx,18xxx */ public static void Demo() { String tel="18939850857"; String telReg="1[358]\\d{9}"; System.out.println(tel.matches(telReg)); } public static void checkQQ1() { String qq="18939850857"; String regex="[1-9][0-9]{4,14}"; //String regex="[1-9]\\d{4,14}";//第一位是数字。后面共4-14位是数字。 boolean flag=qq.matches(regex); if(flag) System.out.println(qq+"...is Ok"); else System.out.println(qq+"....不合法"); } /* 对qq号码进行效验 要求:5--15 0不能开头,只能是数字 以下方式,使用string类中的方法,进行组合完成了需求,但是带么过于复杂。 */ public static void checkQQ() { String qq ="3826"; int len=qq.length(); if(len>=5&&len<=15) { if(!qq.startsWith("0")) { try { long l=Long.parseLong(qq); System.out.println("qq:"+1); } catch (NumberFormatException e) { System.out.println("出现非法字符。。。。。"); } /* char[] arr=qq.toCharArray(); boolean flag=true; for(int x=0;x<arr.length;x++) { if(!(arr[x]>='0'&&arr[x]<='9')) { flag=false; break; } } if(flag) { System.out.println("qq:"+qq); } else { System.out.println("出现非法字符"); } */ } else { System.out.println("开头不能为0"); } } else { System.out.println("长度不合法"); } }}这里写代码片
替换示例:
去掉重复字符,
import java.util.regex.*;class RegexTest{ public static void main(String[] args) { getDemo(); } public static void getDemo() { String str="我我...我我...我要.....要要....要去....去去去..吃吃吃..吃..吃饭.饭...饭饭饭..饭.....饭"; /* 将已有字符串先变成另一个字符串,使用替换功能。 1.可以先将.去掉。 2,在将多个重复的内容变成单个内容。 */ str=str.replaceAll("\\.+",""); System.out.println(str); str=str.replaceAll("(.)\\1+","$1");//去叠词 System.out.println(str); }}
编译结果:
192.68.1.254.102.49.23.013.10.10.10.10.002.2.2.2.8.109.90.30
将IP地址进行地址段顺序的排序
思路:
1.按照字符串自然顺序,按照需要最多的0来补齐,每一段保证都有3位
2.将每一段只保留3位。保证ip地址每一段都是3位
3..通过切割功能,将ip地址进行拆分存储在TreeSet集合中(存储时就进行默认排序)
4.高级for循环打印集合中的ip地址,并去掉ip地址前面多余的0;
代码示例:
import java.util.regex.*;import java.util.*;class RegexTest2{ public static void main(String[] args) { ipSort(); //getDemo(); }public static void ipSort() { String ip="192.68.1.254 102.49.23.013 10.10.10.10 002.2.2.2 8.109.90.30"; ip=ip.replaceAll("(\\d+)","00$1"); System.out.println(ip); ip=ip.replaceAll("0*(\\d{3})","$1"); System.out.println(ip); String[] arr=ip.split(" "); TreeSet<String> ts=new TreeSet<String>(); for(String s :arr) { ts.add(s); } for(String s:ts) { System.out.println(s.replaceAll("0*(\\d+)","$1")); } } }
编译结果:
正则表达式的第四个功能
4.获取
操作步骤:
1.将正则表达式封装成对象。
2.让正则对象和要操作的字符串相关联
3.关联后,获取正则匹配引擎。
4.通过引擎对符合规则的字串进行操作,比如:取出。
import java.util.regex.*;class RegexDemo2 { public static void main(String[] args) { getDemo(); } public static void getDemo() { String str="ming tian jiu yao fang jia le ,dajia"; String ren="\\b[a-z]{3}\\b";// (\b)单词边界 找出三个的单词 //str="123456"; //String reg="[1-9]\\d{4,14}"; //将规则封装成对象。 Pattern p=Pattern.compile(ren); //让正则对象和要作用的字符串想关联。获取匹配器对象。 Matcher m=p.matcher(str); //System.out.println(m.matches()); //String类中的matches方法用的是 Parter 和Matcher对象来完成的 //被String方法封装,使用简单,但功能单一 /* boolean b=m.find();//将规则作用到字符串上,并进行复核规则的子串查找 System.out.println(b);// true System.out.println(m.group());//用于获取匹配后的结果。min boolean b1=m.find(); System.out.println(b1);// true System.out.println(m.group());// tia */ while(m.find())//找出3个字母的单词 { System.out.println(m.group()); } }}
常用邮箱名称效验方式
代码:
class RegexTest3{ public static void main(String[] args) { checkMail(); } public static void checkMail() { String mail="abc120@sina.com.cn.cn"; mail="1@1.1"; String reg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//较为精确的匹配 reg="\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。(网站有这样的匹配) //mail.indexoF("@")!=-1;//有 @ 就能匹配上 System.out.println(mail.matches(reg)); }}
- 黑马程序员—正则表达式
- 黑马程序员—正则表达式
- 黑马程序员—正则表达式
- 黑马程序员—正则表达式
- 黑马程序员—正则表达式
- 黑马程序员—正则表达式
- 黑马程序员—正则表达式
- 黑马程序员—正则表达式
- 黑马程序员—正则表达式
- 黑马程序员———正则表达式
- 黑马程序员———正则表达式
- 黑马程序员———正则表达式
- 黑马程序员———正则表达式
- 黑马程序员——正则表达式
- 黑马程序员——正则表达式
- 黑马程序员——正则表达式
- 黑马程序员——正则表达式
- 黑马程序员Java——正则表达式
- 矩阵构造方法
- POJ2001 字典树
- Weka初体验——中文文本分类
- OC学习笔记11--protocol使用方法及注意事项
- BootStrap媒体对象
- 黑马程序员——正则表达式
- IOS开发基础之UIImage
- Android SQLite学习指南
- android m classpath
- Netroid学习笔记(一):初识Netroid
- Netroid学习笔记(二):请求的使用
- [Leetcode 113, Medium] Path sum II
- java String 中的==null、length()==0、=="" 理解
- codeforce #126Div2 200A Cinema 【优化暴力枚举】