正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用一些特定的符号来表示一些代码的操作.这样就简化书写。所以学习正则表达式就是学习一些特殊符号的使用。
好处:可以简化对字符串的操作。
弊端:符号定义越多,正则越长,阅读性越差。
 
具体操作功能:
  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. 四则运算小程序测试--c++--软件工程课

    一.测试内容: 1.生成题目数是否准确?2.打印方式(列数l.行间距jj)是否准确?3.有无乘除法cc是否准确?4.数的范围fw是否准确?5.除法有无余数c是否准确?6.加减有无负数f是否准确? 二. ...

  2. hibernate3连oracle的各种坑。。

    坑一:驱动错误导致sql查询不了,升级驱动到最新版即可 2.通过构造函数封装数据时,如果报错无法实例化并且不是因为字段不对应导致的,可以试试把float改为Float之类的包装类

  3. 阿里云无线&前端团队是如何基于webpack实现前端工程化的

    背景 前端经历了初期的野蛮生长(切图,写简单的特效)——为了兼容浏览器兼容性而出现的各种类库(JQUERY,YUI等——mv*(饱暖思淫欲,代码多了,也就想到怎样组织代码结构,backbone,ang ...

  4. 【转】利用TCMalloc优化Nginx的性能

    From: http://www.linuxidc.com/Linux/2013-04/83197.html TCMalloc的全称是 Thread-Caching Malloc,是谷歌开发的开源工具 ...

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

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

  6. 2.C#基础篇-->数据类型

    C#数据类型分为:值类型,引用类型和指针类型(仅在不安全代码中使用) 1.值类型. 值类型包含:简单类型(整型,浮点类型和小数类型),枚举类型和结构类型.所有值类型都隐含的声明一个公共的无参构造函数, ...

  7. C语言函数指针基础

    本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...

  8. 【BZOJ】【TJOI2015】线性代数

    网络流/最小割/最大权闭合图 2333好开心,除了一开始把$500^2$算成25000……导致数组没开够RE了一发,可以算是一次AC~ 咳咳还是回归正题来说题解吧: 一拿到这道题,我就想:这是什么鬼玩 ...

  9. 【BZOJ】【1874】取石子游戏

    SG函数 嗯博弈论入门题,关于SG函数这个东西可以去看VFK神犇的博客,讲的非常清楚Orz. 传送门:vfleaking.blog.163.com/blog/static/17480763420123 ...

  10. 剑指offer--面试题21

    题目:设计包含min函数的栈,pop(),push(),min()的时间复杂度均为O(1) 自己所写代码如下:(写‘栈’的代码还是有些不熟练!) #include <iostream> u ...