正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用一些特定的符号来表示一些代码的操作.这样就简化书写。所以学习正则表达式就是学习一些特殊符号的使用。
好处:可以简化对字符串的操作。
弊端:符号定义越多,正则越长,阅读性越差。
 
具体操作功能:
  1.匹配    boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。
                用规则匹配整字符串,只要有一处不符合规则,就匹配结束,返回false  
 
  2.切割    String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
 
 
  3.替换    String replaceAll(String regex, String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 
           
String replaceFirst(String regex, String replacement)
使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
对上面的三种进行演示如下:
class RegexDemo
{
public static void main(String[] args)
{
//CheckQQ_1();
//CheckQQ();
//demo();
//CheckTel();
//SplitDemo();
ReplaceDemo();
} //替换演示
public static void ReplaceDemo()
{
//String str = "123dffhe568kkkdsr7885445e";//要求:将字符串的数字替换成‘#’
//String regex = "\\d{5,}";//可以规定超过5个数字就将数字替换成‘#’
//String s = "#"; //String str = "zhakksxsqqwanwwwwu";//将叠词进行替换'&'
//String regex = "(.)\\1+";
//String s = "&"; String str = "zhakksxsqqwanwwwwu";//将叠词字符由多个变成一个
String regex = "(.)\\1+";
String s = "$1"; System.out.println(str.replaceAll(regex,s));
} //切割演示
public static void SplitDemo()
{
//String str = "zhangsan lisi wangwu";
//String regex = " +"; //一次或多次空格 //String str = "zhangsan.lisi.wangwu";
//String regex = "\\."; //特殊字符,对点和反斜杠进行转义 //String str = "zhangsan,lisi,wangwu";
//String regex = ","; //String str = "c:\\zhangsan\\lisi\\wangwu";
//String regex = "\\\\"; String str = "zhakksxsqqwanwwu";//按照叠词进行切割
String regex = "(.)\\1+";//第一次切割的结果为组被重用,接着进行后面一次或多次的切割(每一个组按照顺序有编号,反向引用第一组) String[] arr = str.split(regex); for(String s: arr)
{
System.out.println(s);
}
}
//匹配字符演示
public static void demo()
{
String str = "a";
String regex = "[bcd]";//给定要比较的字符串中内容必须只能是规则中的某一个字符。
boolean b = str.matches(regex);
System.out.println(b);//false
}
//匹配手机号 13xxx,15xxx,18xxx
public static void CheckTel()
{
String tel = "";
String regex = "[1][358]\\d{9}";//"[1][358]\\d{3,10}"
System.out.println(tel.matches(regex));
} //匹配QQ号
public static void CheckQQ()
{
String qq = "";
//String regex = "[1-9][0-9]{4,14}";
String regex = "[1-9]\\d{4,14}"; boolean flag = qq.matches(regex); if(flag)
System.out.println("qq:"+qq);
else
System.out.println("qq不符合要求!");
} /*
需求:对QQ号码进行校验
要求:5~15位,0不能开头,只能是数字
这种方式是使用String类中的方法,进行组合完成了需求,但是代码过于复杂。
*/
public static void CheckQQ_1()
{
String qq = "";
int len = qq.length();
if(len>= && len<=)
{
if(!qq.startsWith(""))//qq.chatAt(0)==0 //Integer.parseInt("12a") NumberFormatException
{
try
{
long l = Long.parseLong(qq);
System.out.println("qq:"+qq);
}
catch(NumberFormatException e)
{
System.out.println("qq出现非法字符......");
} /*
char[] arr = qq.toCharArray();
boolean flag = true;
for(int i=0;i<arr.length;i++)
{
if(!(arr[i]>='0' && arr[i]<='9'))
{
flag = false;
break;
}
}
if(flag)
{
System.out.println("qq:"+qq);
}
else
{
System.out.println("qq出现非法字符!");
}
*/
}
else
{
System.out.println("qq不能以0开头!");
}
}
else
{
System.out.println("qq号长度错误,请重新输入!");
}
}
}
java.util.regex 
类 Pattern(final):正则表达式的编译表示形式。 
static Pattern compile(String regex) 
 将给定的正则表达式编译到模式中。 
 
java.util.regex 
类 Matcher(final):通过解释 Pattern 对 character sequence 执行匹配操作的引擎。  
int end() 
 返回最后匹配字符之后的偏移量(最后但不包括的索引)。
int start() 
 返回以前匹配的初始索引。
             String group() 
              返回由以前匹配操作所匹配的输入子序列。  
 
正则表达式的第四个功能:
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,du jia!";
System.out.println(str); String regex = "\\b[a-z]{4}\\b";//查找四个单词的子字符串 //str = "1237458";
//String regex = "[1-9]\\d{4,14}"; //将规则封装成对象。static Pattern compile(String regex)
Pattern p = Pattern.compile(regex); //让正则对象与要操作的字符串关联,返回一个匹配器。Matcher matcher(CharSequence input)。String实现了字符序列接口CharSequence
Matcher m = p.matcher(str); //通过引擎(匹配器)对负荷规则的字符串进行操作,例如引擎对象的方法 matches() //System.out.println(m.matches());//其实String类中的matcher方法。用的就是Pattern和Matcher对象来完成的。
//只不过被String的方法封装后,使用起来更为简单。但是功能却很单一。 while(m.find())//将规则作用到字符串上,并进行符合规则的子串查找。
{
System.out.println(m.group());//用于获取匹配后的结果
System.out.println(m.start()+"...."+m.end());
}
}
}
 
正则表达式的应用举例如下:
练习1:将下列字符串转换成:我要学编程
到底用四种功能中的哪一个?或者哪几个呢?
思路方式:
   1.如果只是想知道该字符串是否对与错,使用匹配
   2.想要将已有的字符串替换成其他的字符串,使用替换
   3.想要按照自定的方式将字符串变成多个子串,使用切割。获取规则以外的子串
   4.想要拿到符合需求的字符串子串,使用获取。获取符合规则的子串
class RegexTest
{
public static void main(String[] args)
{
Test();
} public static void Test()
{
String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编编..程.程程...程...程";
StringBuilder sb = new StringBuilder(); //先切割(以出现一次或多次的点作为分隔符。特殊字符,对点和反斜杠进行转义)
String regex1 = "\\.+"; String[] arr = str.split(regex1); for(String s:arr)
{
sb.append(s);
} //再替换(将一个或多个叠词替换成一个字符)
String regex2 = "(.)\\1+";
String s1 = "$1";
System.out.println(sb.toString().replaceAll(regex2,s1));
}
}
练习2:192.68.1.54 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
将ip地址进行地址段的顺序进行排序
 
思路:还按照字符串的自然顺序,只要让它们每一段都是3位即可。
1.按照每一段需要的最多的0进行补齐,那么每一段至少能保证有3位
2.将每一段只保留3位。那么,所有的ip地址都保留了3位。
3.切割后,再进行排序
4.进行最后的一次替换,返回原ip
public static void ipsort()
{
String ip = "192.68.1.54 102.49.23.013 10.10.10.10 2.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"));
}
} //对qq邮件地址进行校验
public static void checkMail()
{
String mail = "xiayuanquan@qq.com";
//mail = "1360074459@qq.com"; //String regex = "[a-zA-Z0-9_]+@(qq|QQ)(\\.[a-zA-Z]+)+";
String regex = "\\w+@\\w+(\\.\\w+)+"; if(mail.matches(regex))
System.out.println(mail);
else
System.out.println("mail is error!");
} }
练习3:网页爬虫(蜘蛛)
import java.io.*;
import java.util.regex.*;
import java.net.*;
class RegexTest3
{
public static void main(String[] args)throws Exception
{
getMails();
getMails_1();
} //获取指定文档中的邮件地址,使用获取功能使用Pattern,Matcher
public static void getMails()throws Exception
{
BufferedReader bufr = new BufferedReader(new FileReader("mails.txt")); String line = null;
String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
//String regex = "\\w+@\\w+(\\.\\w+)+"; Pattern p = Pattern.compile(regex); while((line=bufr.readLine())!=null)
{
Matcher m = p.matcher(line); while(m.find())
{
System.out.println(m.group());
}
}
} //从网络上获取邮件地址
public static void getMails_1()throws Exception
{
URL url = new URL("http://www.baidu.com:8080/mail.html"); URLConnection conn = url.openConnection(); BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null;
String regex = "\\w+@\\w+(\\.\\w+)+"; Pattern p = Pattern.compile(regex); while((line=bufIn.readLine())!=null)
{
Matcher m = p.matcher(line); while(m.find())
{
System.out.println(m.group());
}
}
}
}

Java:正则表达式的详解的更多相关文章

  1. java正则表达式语法详解及其使用代码实例

    原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. ...

  2. Java正则表达式应用详解

    如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单.如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字 ...

  3. 黑马程序员 Java正则表达式,详解反斜线在Java中的作用

    ---------------------- ASP.Net+Android+IO开发S. .Net培训.期待与您交流! ---------------------- 在程序设计过程中,经常需要对获取 ...

  4. Java正则表达式API详解

    1. Pattern类 public class PatternExample { /** * public static String quote(String s) * 返回指定字符串的字面值模式 ...

  5. Java正则表达式实例详解

    创建正则表达式 你可以从比较简单的东西入手学习正则表达式.要想全面地掌握怎样构建正则表达式,可以去看JDK 文档的java.util.regex 的Pattern 类的文档. 字符 B 字符B \xh ...

  6. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  7. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  8. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  9. Java String类详解

    Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...

  10. 最新java数组的详解

    java中HashMap详解 http://alex09.iteye.com/blog/539545 总结: 1.就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java ...

随机推荐

  1. 谈谈 Repository、IUnitOfWork 和 IDbContext 的实践

    谈谈 Repository.IUnitOfWork 和 IDbContext 的实践 上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext ...

  2. Careercup - Microsoft面试题 - 5718181884723200

    2014-05-11 05:55 题目链接 原题: difference between thread and process. 题目:请描述进程和线程的区别. 解法:操作系统理论题.标准答案在恐龙书 ...

  3. IOS常用加密DES

    NSString+DES.h // // NSString+DES.h // haochang // // Created by Administrator on 14-4-15. // Copyri ...

  4. WinForm-利用Anchor和Dock属性缩放控件

    转自:http://www.cnblogs.com/tianzhiliang/articles/2144692.html 有一点让许多刚接触WinForms编程的开发者感到很棘手,就是在用户调整各种控 ...

  5. python-根据字符串动态生成对象eval

    # -*- coding: utf-8 -*- stock1={ 'stockName':"沈阳机床", ", 'averagePrice_yesterday':34.0 ...

  6. 导入ApiDemo报错,找不到R文件

    1.先检查当前ApiDemo对应的SDK版本是否一致(项目右键-Properties-Android) 2.查看是什么错误.我的就是layout中的progressbar_2.xml中所有组件的id前 ...

  7. NDK: unable to watch local variables after using GCC4.8

    the problem definitly apears after changing toolchain from gcc 4.6 to gcc 4.8. here's a solution wit ...

  8. VC++之GetLastError()使用说明

    VC中GetLastError()获取错误信息的使用 在VC中编写应用程序时,经常需要涉及到错误处理问题.许多函数调用只用TRUE和FALSE来表明函数的运行结果.一旦出现错误,MSDN中往往会指出请 ...

  9. 树链剖分 - BZOJ 1036: [ZJOI2008]树的统计Count

    这是树链剖分的入门题,也是我学树链剖分的第一题. 树链剖分:就是把树中和线段树联系起来,求(u,v)路径中权值的最大值和其路径的权值和. 入门blog:http://blog.sina.com.cn/ ...

  10. asp.net MVC3 + JQuery 的ajax简单使用

    一直都没有使用过JQuery,更没使用过JQuery的ajax支持带来的方便,今天试了一下,真是减少了很多工作量,使用方法也比较简单 这里先记下来,以后使用时可以再拿着用. 本应用中,本来是准备使用长 ...