--------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ---------------

正则表达式

一、概述:

1、概念:符合一定规则的表达式。

2、作用:用于专门操作字符串。

3、特点:用于一些特定的符号来表示一些代码操作,这样就可以简化代码书写。

4、好处:可简化对字符串的基本操作。

5、弊端:符号定义越多,正则越长,阅读性越差。

二、常用符号:

1、字符

构造                                    匹配

\\                                    反斜线字符

\t                                    制表符

\n                                    回车符

\f                                     换页符

2、字符类

[abc]                              a、b或c(简单类)

[^abc]                            任何字符,除了a、b或c(否定)

[a-zA-Z]                         a到z货A到Z

[a-d[m-p]]                     a到d或m-p:[a-dm-p](并集)

3、预定义字符类

                                    任何字符(与行结束符可能匹配也可能不匹配)

\d                                   数字: [0-9]

\D                                  非数字:  |^[0-9]

\s                                  空白字符:[ \t\n\x0B\f\r]

\S                                  非空白字符:[^ \t\n\x0B\f\r]

\w                                  单词字符:[a-zA-Z_0-9]

\W                                  非单词字符:[^\w]

4、边界匹配器

^                                  行的开头

$                                  行的结尾

\b                                  单词边界

\B                                  非单词边界

\A                                  输入的开头

5、Greedy数词量---->匹配整个字符串

X?                                  X,一次或一次也没有

X*                                  X,零次或多次

X+                                  X,一次或多次

X{n}                               X,恰好n次

X{n,}                             X,至少n次

X{n,m}                         X,至少n次,但不超过m次

6、组和捕获

组:在正则中用()来表示,作用是结果可以被重用,如(.)\\1+,代表的是任意字符出现了多次,就业是叠词

捕获:在正则中可以使用$加上组的编号来完成捕获的,如:"(.)\\1+", "$1"这个$1就代表组代表的元素

三、正则表达式主要有四种具体功能:匹配、切割、替换和获取

1、匹配:用规则匹配整个字符串,只要有一处不符合,就匹配结束,返回false

/*
* 匹配:String的matches方法,用规则匹配字符串,只有有一处不符合规则就匹配结束,返回false
*/
public static void match_method() {
// 匹配手机号只有13***,15***,18****
String tel = "15900001111";
String teiReg = "1[358]\\d{9}";
System.out.println(tel.matches(teiReg)); // 匹配多位
String str = "a5656";
String reg = "[a-zA-Z]\\d*";
System.out.println(str.matches(reg)); // 校验QQ号码,5~15,不能0开头,不能有字母
String qq = "545454545";
String qqReg = "[1-9]\\d{4,14}";
System.out.println(qq.matches(qqReg));
}

2、切割:
split(String regex)

// 按照叠词完成切割。为了可以让规则的结果被重用,可以将规则封装成一个组。用()完成。
// 组的出现都有编号。从1开始。 想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。
split_method("ghghhjhhgkaaalkood", "(.)\\1+");
// 按照“.”切,.在正则中是代表任意字符,所以需要转译,然而\.在双引号中也需要转译
split_method("zhang.li.wang", "\\.");
// 按照“\\”切
split_method("c:\\abc\\a.txt", "\\\\");
// 按照空格切
split_method("abc a.txt hhhh", " +"); /*
* 切割 split
*/
public static void split_method(String str, String reg) {
String[] arr = str.split(reg);
System.out.println(arr.length);
for (String s : arr) {
System.out.println(s);
}
}

3、替换:
replaceAll(String regex, String replacement)

String str = "wer1389980000ty1234uiod234345675f";//将字符串中的数组替换成#。
replaceAllDemo(str, "\\d{5,}", "*");
//将叠词替换成#. //将重叠的字符替换成单个字母。zzzz->z
str = "erkktyqqquizzzzzo";
replaceAllDemo(str,"(.)\\1+","$1");//$获取组 /*
* 替换
*/
public static void replaceAllDemo(String str,String reg,String newStr){
str = str.replaceAll(reg, newStr);
System.out.println(str);
}


4、获取:

获取:将字符串中的符合规则的子串取出。
操作步骤:
1)将正则表达式封装成对象。
2)让正则对象和要操作的字符串相关联。
3)关联后,获取正则匹配引擎。
4)通过引擎对符合规则的子串进行操作,比如取出。

/*
* 正则表达式第四个功能:获取,将字符串中符合规则的字串获取出来
*
* 操作步骤:
* 1、将正则表达式封装成对象
* 2、让正则对象和要操作的字符串相关联
* 3、关联之后,获取正则匹配引擎
* 4、通过引擎对符合规则的字符串进行操作,比如取出
*/
public class RegexDemo2 {
public static void main(String[] args) {
getDemo();
} public static void getDemo(){
String str = "hahahaha hui jia guo nian la";
String reg = "\\b[a-z]{3}\\b";// \b单词分隔符//取出str中有三个字母组成的单词
// str = "415454d51";
// reg = "[1-9]{4,14}"; //将正则表达式封装成对象
Pattern p = Pattern.compile(reg); //将要操作的字符串和正则对象相关联,获取匹配器对象
Matcher m = p.matcher(str); //其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
//只不过被String的方法封装后,用起来较为简单。但是功能却单一。
// System.out.println(m.matches()); // boolean b = m.find();//将规则作用到字符串上,并进行符合规则的查找
// System.out.println(m.group());
// boolean b1 = m.find();//将规则作用到字符串上,并进行符合规则的查找
// System.out.println(m.group()); while(m.find()){
System.out.println(m.group());
System.out.println(m.start() + "......" + m.end());
}
}
}

练习:

/*
* 正则练习
*
* 思路方式:
* 1、如果只想知道该字符串是对是错使用匹配
* 2、要想将已有的字符串变成另一个字符串,替换
* 3、想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
* 4、想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
*/
public class RegexTest { public static void main(String[] args) {
test_1();
// ipSort();
// checkMail();
} /*
* 需求:将下列字符串转成:我要学编程. 到底用四种功能中的哪一个呢?或者哪几个呢?
*
* 将已有字符串变成另一个字符串。使用 替换功能。 1,可以先将 . 去掉。 2,在将多个重复的内容变成单个内容。
*/
public static void test_1() {
String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
str = str.replaceAll("\\.+", "");
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
} /*
* 192.68.1.254 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位。
*/
public static void ipSort(){
String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
ip = ip.replaceAll("(\\d+)", "00$1");//给每一段都不上0,按照最少位数的需要进行补
ip = ip.replaceAll("0*(\\d{3})", "$1");//只保留三位数字的字段
System.out.println(ip); String[] arrs = ip.split(" +");
TreeSet<String> ts = new TreeSet<String>();
for(String s : arrs){
ts.add(s);
}
for(String s : ts){
System.out.println(s.replaceAll("0*(\\d+)", "$1"));
}
} /*
* 需求:对邮件地址进行校验。
*/
public static void checkMail(){
String mail = "abc12@sina.com";
String reg = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z]+)+";//较为精确
// reg = "\\w+@\\w+(\\.\\w)+";//相对不太精确的匹配。 System.out.println(mail.matches(reg));
}
}

2、网页爬虫(蜘蛛):

实际上是一个功能,用于搜集网络上的指定信息,例如百度就在应用这项技术获取各种关键字,可供搜索,简单的说你要在百度上搜索一个“春节”的关键字,它就会找到跟关键字相关联的文章列出来。其实百度事先就在各个网页上获取了相关资源,这个获取资源就是通过网页爬虫技术来完成的。

需求:可用于收集邮箱等之类的信息。

/*
* 网页爬虫(蜘蛛)获取网页数据工具
*/
public class RegexTest2 {
public static void main(String[] args) throws IOException {
// getMail();
getMailByNet();
} /*
* 获取网页数据,获取网页上有关邮箱的数据
*/
public static void getMailByNet() throws IOException {
URL url = new URL("http://192.168.229.1:8080/myweb/mail.html");
URLConnection conn = url.openConnection(); BufferedReader bfrin = new BufferedReader(new InputStreamReader(
conn.getInputStream())); String mailReg = "\\w+@\\w+(\\.[a-zA-Z])+";
Pattern p = Pattern.compile(mailReg);
String line = null; while ((line = bfrin.readLine()) != null) {
Matcher m = p.matcher(line);
while (m.find()) {
System.out.println(m.group());
}
}
bfrin.close();
} /*
* 获取指定文档中的邮件地址。 使用获取功能。Pattern Matcher
*/
public static void getMail() throws IOException {
BufferedReader bfr = new BufferedReader(new FileReader("mail.txt")); String mailReg = "\\w+@\\w+(\\.[a-zA-Z])+";
Pattern p = Pattern.compile(mailReg);
String line = null; while ((line = bfr.readLine()) != null) {
Matcher m = p.matcher(line);
while (m.find()) {
System.out.println(m.group());
}
}
bfr.close();
}
}

黑马程序员 ---> 正则表达式的更多相关文章

  1. 黑马程序员:Java基础总结----正则表达式

    黑马程序员:Java基础总结 正则表达式   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 正则表达式 import  java.util.regex.*; 符合一定规 ...

  2. 黑马程序员:轻松精通Java学习路线连载1-基础篇!

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

  3. 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具

        Java学习路线图引言:        黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...

  4. 黑马程序员——【Java高新技术】——代理

    ---------- android培训.java培训.期待与您交流! ---------- 一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法 ...

  5. 黑马程序员+SQL基础(上)

    黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...

  6. 黑马程序员+Winform基础(上)

    黑马程序员+Winform基础 ---------------<a href="http://edu.csdn.net"target="blank"> ...

  7. 黑马程序员—C语言的函数、数组、字符串

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参 ...

  8. 黑马程序员:Java基础总结----泛型(高级)

    黑马程序员:Java基础总结 泛型(高级)   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...

  9. 黑马程序员:Java基础总结----类加载器

    黑马程序员:Java基础总结 类加载器   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...

随机推荐

  1. mac 下安装和卸载 mysql

    这里有一篇文章写得很详细: http://www.cnblogs.com/macro-cheng/archive/2011/10/25/mysql-001.html 关于卸载,我也百度了下.找了好几个 ...

  2. http协议与http代理

    TCP/IP协议族 TCP/IP(Transmission Control Protocol/InternetProtocol.传输控制协议/网际协议)是用于计算机通信的一个协议族. TCP/IP协议 ...

  3. .net c# 提交包含文件file 的form表单 获得文件的Stream流

    1.前台html代码 要写一个有id的form,可是不能有runat="server"属性.由于一个页面中,有这个属性的form表单仅仅能有一个. 再要有一个有name的ifram ...

  4. Git基础 1 ---- 版本控制系统的介绍

    1 Git 1 版本控制系统 vcs - version control system 2 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统 3 版本控制系统的主要功能 1 ...

  5. Win7/8在用账户密码登录时, 设置成保留用户名, 只输入密码

    修改注册表, 0表示保留用户名. 1表示每次都需要输入用户名密码. 位置: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersio ...

  6. 【转载】Google Analytics 使用图文全攻略

    转载自:Google Analytics 使用图文全攻略 最近一段时间,因为工作的需要,小励使用GA(GA是Google Analytics的简称)比较频繁,所以花时间研究了一下,从不太了解到会使用( ...

  7. TC基础使用指南(基于xbeta的TC配置文件)

    所有常用目录都可以通过ctrl+d加一个或几个字母的超快捷方式直接跳转到位. 按下BackSpace键,就可以进入到上一级目录 Ctrl+q 在右侧打开左侧选定文件,再按一次Ctrl+q退出 按 Ct ...

  8. 软件源(Software Sources)

    写在前面:浏览了很多国内外的网站,看了很多关于软件源(Software Sources)设置的文章,发现有很多文章中对软件源的设置存在误解,为了让新人能顺利进入Ubuntu的大家庭,特地作此文,详细地 ...

  9. openrisc 之 Wishbone总线学习笔记——接口信号定义

    这部分内容就是copy下来的,网上到处都有.先看看接口啥样子,在详细说明 接口定义copy http://blog.csdn.net/ce123/article/details/6929897.百度文 ...

  10. VCC、VDD、VEE、VSS的区别

    电路设计以及PCB制作中,经常碰见电源符号:VCC. VDD.VEE.VSS,他们具有什么样的关系那? 一.解释 VCC:C=circuit 表示电路的意思, 即接入电路的电压 VDD:D=devic ...