黑马程序员----Java基础:正则表达式

------- android培训java培训、期待与您交流! ----------

正则表达式:符合一定规则的表达式,用特定符号来表达一些代码。

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

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

优点:可以简化对字符串的复杂操作。

缺点:符号定义越多,正则表达式越长,阅读性越差

正则表达式的构造摘要

1. 字符

\\                 反斜线字符

\t                 制表符 (‘\u0009‘)

\n                 新行(换行)符 (‘\u000A‘)

\r                 回车符 (‘\u000D‘)

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](并集)

[a-z&&[def]]               d、e或 f(交集)

[a-z&&[^bc]]        a到 z,除了 b和 c:[ad-z](减去)

[a-z&&[^m-p]]     a到 z,而非 m到 p:[a-lq-z](减去)

3、预定义字符类

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

\d                        数字:[0-9]

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

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

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

4、边界匹配器

\b                        单词边界

\B                       非单词边界

5、Greedy数量词

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

X*                       X,零次或多次

X+                       X,一次或多次

X{n}                    X,恰好 n次

X{n,}                   X,至少 n次

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

6、组和捕获

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:

1     ((A)(B(C)))

2     \A

3     (B(C))

4     (C)

组零始终代表整个表达式。在替换中常用$匹配组的内容。

具体操作功能:匹配、切割、替换和获取

匹配:String  matches方法

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

判断一串数字是否是手机号:手机号段只有 13xxx 15xxx 18xxxx

public static void checkTel()

{

String tel = "16900001111";

String telReg = "1[358]\\d{9}";

System.out.println(tel.matches(telReg));

}

判断字符串是否是以字母开头其余全是数字

public static void demo()

{

String str = "b23a23456789";

String reg = "[a-zA-Z]\\d*";

boolean b= str.matches(reg);

System.out.println(b);

}

判断qq是否正确:qq5-15位,不能以0开头,中间也不能有字母

public static void checkQQ()

{

String qq = "123a454";

String regex = "[1-9]\\d{4,14}";

boolean flag = qq.matches(regex);

if(flag)

System.out.println(qq+"...is ok");

else

System.out.println(qq+"... 不合法");

}

切割:String split();

    多空格切割:" _+"  _表示空格

.点的切割:"\."操作

\\ 切割 :"\\\\"操作

叠词的切割:"(.)\\1+"来操作,其中(.)是通配符,\\1代表叠一次,后面的+表示叠了多次。

实例:用 \\ 切割c:\\abc\\234\\a.doc

class RegexDemo

{

public static void main(String[] args)

{

splitDemo("c:\\abc\\234\\a.doc","\\\\");

}

public static void splitDemo(String s,String t)

{

String [] arr= s.split(t);

for(String st:arr)

System.out.println(st);

}

}

替换String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。

典型的写法 str.replaceAll("(.)\\1+","$1")

实例:

public static void test_1()

{

String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.        程程...程...程";

/*

将已有字符串变成另一个字符串。使用 替换功能。

1,可以先将 . 去掉。

2,在将多个重复的内容变成单个内容。

*/

str = str.replaceAll("\\.+","");

System.out.println(str);

str = str.replaceAll("(.)\\1+","$1");

System.out.println(str);

}

获取:将字符串中的符合规则的子串取出。

操作步骤:

1,将正则表达式封装成对象。            Pattern p = Pattern.compile(reg);

2,让正则对象和要操作的字符串相关联。  Matcher m = p.matcher(str);

3,关联后,获取正则匹配引擎。           while( m.find())

4,通过引擎对符合规则的子串进行操作,    {    m.group(); }               伪代码

比如取出。

实例:获取ming tian jiu yao fang jia le ,da jia。 中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 ,da jia。";

System.out.println(str);

String reg = "\\b[a-z]{4}\\b";

//将规则封装成对象。

Pattern p = Pattern.compile(reg);

//让正则对象和要作用的字符串相关联。获取匹配器对象。

Matcher m  = p.matcher(str);

while(m.find())

{

System.out.println(m.group());

System.out.println(m.start()+"...."+m.end());//返回索引位置

}

}

}

其中group(),start(),end()所带的参数i就是正则表达式中的子表达式索引(第几个子表达式)

用法总结:

1.只想知道字符串对错(判断)用匹配

2.将字符串变为另一个字符串  用替换

3.将字符串按规则获取成多个子串  用分割

4.想获取字符串中的一部分  用获取


网页爬虫实例:

/*

网页爬虫(蜘蛛)

实际上是一个功能,用于搜集网络上的指定信息

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

应用:如通过关键字搜索,实际就是使用“蜘蛛”,通过查找关键字获取相关的信息

*/

import java.io.*;

import java.util.regex.*;

import java.net.*;

import java.util.*;

class RegexTest2

{

public static void main(String[] args) throws Exception

{

getMails_1();

}

public static void getMails_1()throws Exception

{

URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");

URLConnection conn = url.openConnection();

BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));

String line = null;

String mailreg = "\\[email protected]\\w+(\\.\\w+)+";

Pattern p = Pattern.compile(mailreg);

while((line=bufIn.readLine())!=null)

{

Matcher m = p.matcher(line);

while(m.find())

{

System.out.println(m.group());

}

}

}

/*

获取指定文档中的邮件地址。

使用获取功能。Pattern  Matcher

*/

public static void getMails()throws Exception

{

BufferedReader bufr =

new BufferedReader(new FileReader("mail.txt"));

String line = null;

String mailreg = "\\[email protected]\\w+(\\.\\w+)+";

Pattern p = Pattern.compile(mailreg);

while((line=bufr.readLine())!=null)

{

Matcher m = p.matcher(line);

while(m.find())

{

System.out.println(m.group());

}

}

}

}

时间: 2024-10-12 00:20:21

黑马程序员----Java基础:正则表达式的相关文章

黑马程序员--Java基础--正则表达式

--Java培训.Android培训.iOS培训..Net培训 期待与您共同交流!-- 正则表达式 1. 基本正则表达式 所谓正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式规则,然后使用该格式规则匹配某个字符串是否符合格式要求. 1.1. "."和"\" "."点儿,在正则表达式中标是任意一个字符. "\"在正则表达式中是转意字符,当我们需要描述一个已经被正则表达式使用的特殊字符时,我们就可以通过使用"

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象

黑马程序员——java基础——多线程

 黑马程序员--java基础--多线程 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行.一个进程中至少有一个线程. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量.

黑马程序员——java基础---IO(input output)流字符流

黑马程序员——java基础---IO(input output)流字符流 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- io(input output)流特点: 1,io流用来处理数据之间的传输 2,java对数据的操作是通过流的方式: 3,java用于操作流的对象都在io包中: 4,流按操作数据分为两种:字节流和字符流: 5,流按流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象

黑马程序员——java基础——反射

 黑马程序员--java基础--反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 反射 其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员. 反射就是把Java类中的各种成分映射成相应的java类. 简单说:反射技术可以对一个类进行解剖. 反射的基石-->Class类 1.java中的类是用来描述一类事物的共性,该类事物有什么属性,没有什么属性

黑马程序员——java基础——内部类

 黑马程序员--java基础--内部类 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 内部类 如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象.这时,为了方便设计和访问,直接将A类定义在B类中.就可以了.A类就称为内部类.内部类可以直接访问外部类中的成员.而外部类想要访问内部类,必须要建立内部类的对象. 内部类的访问规则 1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有

黑马程序员——java基础——集合(Collection)

 黑马程序员--java基础--集合(Collection) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 集合框架的构成及分类,如下图: 1.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 2.数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的.数组中可以存储基本数据类型,集合只能存储对象. 3.

黑马程序员——Java基础篇之对象归要

1.static关键字 1.1.static可以修饰成员变量,成员方法,还有类(其中这里的类是内部类) 1.2.static修饰的部分会随着类的加载而加载: 加载过程:当JVM执行static修饰的代码时,会在内存的共享区给static部分开辟一个空间,供该类持有,static部分不是某个对象的部分,而是该类共有的,所以当一个函数会被多个对象调用时,最好定义成static,这样比较节省空间. 1.3.静态方法只能访问静态成员 原因:如果静态方法中调用了非静态的变量,那么由于静态方法是随着类的加载

黑马程序员--Java基础--01基本概念

1.Java的三大技术架构 JAVAEE(Java Platform Enterprise Edition):  开发企业环境下的应用程序,主要针对web程序开发: JAVASE(Java Platform Standard Edition): 完成桌面应用程序的开发,是其他两者的基础 JAVAME(Java Platform Micro Edition): 开发电子消费产品和嵌入式设备,如手机中的程序 我对三大技术构架理解 1.三大技术是指哪三大技术呢? 答:三大技术分别指JAVAEE,JAV