黑马程序员技术交流社区
标题:
【Java基础交流】之【一张贴搞定正则问题】!!
[打印本页]
作者:
传奇查
时间:
2015-11-25 21:02
标题:
【Java基础交流】之【一张贴搞定正则问题】!!
感觉对你有用就给个鼓励吧~
~
package cn.fuxi._03regex;
/**
* 正则表达式.
*
* 正则表达式用于操作字符串数据.
* 通过一些特定的符号来体现的.
* 所以我们为了掌握正确的表达式,必须要学习一些符号.
* 虽然简化了,但是阅读性差.
*/
public class _01RegexDemo {
public static void main(String[] args) {
String qq = "1234567890";
checkQQ(qq);
System.out.println("-----------------");
//正则表达式.
String regex = "[1-9][0-9]{4,14}";
boolean b = qq.matches(regex);
System.out.println(qq+":"+b);
}
/*
* 需求:定义一个功能对qq好进行校验.
* 需求:长度5~15,只能死数字,0不能开头.
*/
public static void checkQQ(String qq){
int len = qq.length();
if(len>=5 && len<=15){
if(!qq.startsWith("0")){
try{
long l = Long.parseLong(qq);
System.out.println(l+":正确");
}catch(NumberFormatException e){
System.out.println(qq+":含有非法字符");
}
}else{
System.out.println(qq+":不能以0开头");
}
}else {
System.out.println(qq+":长度错误");
}
}
}
复制代码
输出结果:
1234567890:正确
-----------------
1234567890:true
package cn.fuxi._03regex;
/**
* 正则表达式常用构造摘要
*
* 字符类
* [abc]a,b或c(简单类)
* [^abc]任何字符,除了a,b,c
* [a-zA-Z]a到z或A到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次
*
* 边界匹配器
* ^行的开头
* &行的结尾
* \b单词边界
* \B非单词边界
* \A输入的开头
* \G上一个匹配的结尾
* \Z输入的结尾,仅用于最后的结束符(如果有的话)
* \z输入的结尾
*/
public class _02RegexDemo02 {
public static void main(String[] args) {
String str = "aoob";
String reg = "ao?b";//o出现了0次或一次?否,两次
boolean b = str.matches(reg);
System.out.println(str+":"+b);
reg = "ao+b";
b = str.matches(reg);//o出现了一次以上?是,两次
System.out.println(str+":"+b);
str="ab";
reg = "ao+b";//o出现了一次以上?否,0次
b=str.matches(reg);
System.out.println(str+":"+b);
str = "ab";
reg = "ao*b";//o出现了0次或多次?是,0次
b = str.matches(reg);
System.out.println(str+":"+b);
str="aoooooooooob";
reg = "ao{4,}b";//o出现了4次以上?是,10次
b = str.matches(reg);
System.out.println(str+":"+b);
reg = "ao{4,6}b";//o出现了4次到6次?否,10次
b = str.matches(reg);
System.out.println(str+":"+b);
}
}
复制代码
输出结果:
aoob:false
aoob:true
ab:false
ab:true
aoooooooooob:true
aoooooooooob:false
package cn.fuxi._03regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 正则表达式常见功能:匹配,切割,替换,获取
*/
public class _03RegexDemo03 {
public static void main(String[] args) {
functionDemo_01();
System.out.println("------------------");
functionDemo_02();
System.out.println("------------------");
functionDemo_03();
System.out.println("------------------");
functionDemo_04();
System.out.println("------------------");
functionDemo_05();
System.out.println("------------------");
functionDemo_06();
System.out.println("------------------");
functionDemo_07();
}
/*
* 正则表达式对字符串的常见操作
* 1.匹配
* 其实使用的就是String类中的matches方法.
* 2.切割
* 其实使用的就是String类中的split方法.
* 3.替换
*
* 4.获取
*/
//匹配
public static void functionDemo_01(){
//匹配手机号码是否正确
String tel = "15088888088";
String reg = "1[3578]\\d{9}";//"\\"表示一个\
boolean b = tel.matches(reg);
System.out.println(tel+":"+b);
}
//切割
public static void functionDemo_02(){
String str = "zhangsan xiaoqiang wangwu ";
String[] names = str.split(" +");
for(String name:names){
System.out.println(name);
}
}
public static void functionDemo_03(){
String str = "hangmeimei.wentianxiang.xiaoming";
String[] names = str.split("\\.");
for(String name:names){
System.out.println(name);
}
}
/*
*在表达式((A)(B(C)))中,存在四个这样的组:
*1 ((A)(B(C)))
*2 \A
*3 (B(C))
*4 (C)
*组零始终代表整个表达式.
*/
public static void functionDemo_04(){
String str = "zhangsantttxiaoqingmmmmmmzhaoliu";
//(.)表示一组.\\1+表示与第一组相同的出现1次以上
String[] names = str.split("(.)\\1+");
for(String name:names){
System.out.println(name);
}
}
//演示替换
public static void functionDemo_05(){
String str = "zhangsantttxiaoqingmmmmmmzhaoliu";
//$表示抢一个参数的第一组
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
public static void functionDemo_06(){
String str="15800001111";
str = str.replaceAll("(\\d{3})(\\d{4})(\\d{4})", "$1****$2");
System.out.println(str);
}
/*
* 演示获取
* 将正则规则经行对象的封装.
* Pattern p = Pattern.compile("a*b");
* 通过正则对象的matches方法字符串相关联.获取要对字符串操作的匹配器对象Matcher.
* boolean b = m.matches();
*/
public static void functionDemo_07(){
String str = "da jia hao,ming tian bu shang ke";
//\\b表示单词边界
String regex = "\\b[a-z]{3,}\\b";//由三个小写字母构成的
//1.将正则封装成对象
Pattern p = Pattern.compile(regex);
//2.通过正则对象获取匹配器对象
Matcher m = p.matcher(str);
//使用Matcher对象的方法对字符串经行操作
//既然要获取三个字母组成的单词.
//查找:find();
while(m.find()){
System.out.println(m.group());//获取匹配的子序列
System.out.println(m.start()+":"+m.end());
}
}
}
/*
* P.S.
* Pattern类为正则表达式的编译表示形式.指定为字符串的正则表达式必须首先被编译为此类的实例.
* 然后,可将得到的模式用于创建Matcher对象,依照正则表达式,该对象可以与任意字符序列匹配.执行匹配
* 所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式.
*/
复制代码
输出结果:
15088888088:true
------------------
zhangsan
xiaoqiang
wangwu
------------------
hangmeimei
wentianxiang
xiaoming
------------------
zhangsan
xiaoqing
zhaoliu
------------------
zhangsantxiaoqingmzhaoliu
------------------
158****0000
------------------
jia
3:6
hao
7:10
ming
11:15
tian
16:20
shang
24:29
package cn.fuxi._03regex;
import java.util.TreeSet;
/*
* 1.治疗口吃:我我...我我..我我我哦我..要要要....要要要要..要要..学学学学学...学学学学编编编....编...编...编编.程...程..程程..程程程
* 2.对ip地址排序
* 3.对邮件地址校验
*/
public class _04RegexTest01 {
public static void main(String[] args) {
test01();//治疗口吃
System.out.println("------------------");
test02();//对ip地址排序
System.out.println("------------------");
test03();//对邮箱地址校验
}
public static void test01(){
String str = "我我...我我..我我我我..要要要....要要要要..要要..学学学学学...学学学学编编编....编...编...编编.程...程..程程..程程程";
//1.将字符串中的点去掉,用替换
str = str.replaceAll("\\.+", "");
//2.替换叠词
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
/*
* ip地址排序.
* 192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55
*/
public static void test02(){
String ip = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";
System.out.println(ip);
//1.为了让ip可以按照字符串顺次比较,只要让ip的每一段的位数相同.
//所以,补零,按照每一位所需最多0进行补充,每一段都加两个0.
ip = ip.replaceAll("(\\d+)", "00$1");
//然后每一段保留数字后三位
ip = ip.replaceAll("0*(\\d{3})", "$1");
//2.将ip地址切割出来
String[] ips = ip.split(" +");
//3.用TreeSet装入,并自然排序
TreeSet<String> ts = new TreeSet<String>();
for(String ip1 : ips){
ts.add(ip1);
}
for(String ip1:ts){
System.out.println(ip1.replaceAll("0*(\\d+)", "$1"));
}
}
//对邮箱地址校验
public static void test03(){
String mail = "abc@sina.com";
String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+([\\.[a-zA-Z]{1,3}])+";
boolean b = mail.matches(regex);
System.out.println(mail+":"+b);
}
}
复制代码
输出结果:
我要学编程
------------------
192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55
3.3.3.3
105.70.11.55
127.0.0.1
192.168.10.34
------------------
abc@sina.com
:true
感觉对你有用就给个鼓励吧~
~
作者:
传奇查
时间:
2015-11-27 02:39
辛苦编辑的别沉啦哈哈~
作者:
黑夜中那颗星
时间:
2015-11-27 15:15
给你顶一个
作者:
liuzhipeng
时间:
2015-12-5 22:58
非常好
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2