正則表達式:主要应用于操作字符串。通过一些特定的符号来体现

举例:

QQ号的校验

6~9位。0不得开头。必须是数字

String类中有matches方法

matches(String regex)

告知此字符串是否匹配给定的正則表達式

regex,就是给定的正則表達式

public static void checkQQ() {

		//第一位是数字1-9,第二位以后是0-9,除去第一位数剩下数字位数范围是5到8位
String regex = "[1-9][0-9]{5,8}";//正則表達式
String qq = "123459";
boolean flag = qq.matches(regex);
System.out.println(qq+" : "+flag);
}

PS:正則表達式尽管简化了书写,可是代码的阅读性极差

符号意义

正則表達式难就难在符号太多。

提前定义字符类
. 不论什么字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
字符类
[abc] abc(简单类)
[^abc] 不论什么字符,除了 abc(否定)
[a-zA-Z] az
A
Z,两头的字母包含在内(范围)
[a-d[m-p]] ad
m
p[a-dm-p](并集)
[a-z&&[def]] def(交集)
[a-z&&[^bc]] az。除了
b
c[ad-z](减去)
[a-z&&[^m-p]] az,而非
m
p[a-lq-z](减去)

边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(假设有的话)
\z 输入的结尾

Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X。恰好 n
X{n,} X,至少 n
X{n,m} X。至少 n 次,可是不超过m
Logical 运算符
XY X 后跟 Y
X|Y XY
(X) X。作为捕获组
Back 引用
\n 不论什么匹配的 nth捕获组
public static void check() {
<span style="white-space:pre"> </span>
     String string = "aoooooz";
     String regex = "ao{4,}z";//正則表達式
     boolean flag = string.matches(regex);
     System.out.println(string+" : "+flag);
}

常见功能

1.匹配 2.分割 3.替换 4.获取

匹配:用的是String类中的matches方法

	public static void check() {

		//匹配手机号码是否正确
String tel = "18753377511";
//第一位是1,第二位是3或5或8
//String regex = "1[358][0-9]{9}";
String regex = "1[358]\\d{9}";
//字符串中\,代表转义。所以再加上一个"\"将"\"转义
boolean flag = tel.matches(regex);
System.out.println(tel+" : "+flag);
}



分割:就是曾经用的String类中的split(String regex)方法,曾经用的是" ",空格一般的非特殊符号,都可看作规则

空格

public static void check() {
//以空格为分割。分割,空格可能出现多次
String str = "a b c d e f";
String regex = " +";//空格出现1次或者多次
String[] line = str.split(regex);
for(String i : line){
System.out.println(i);
}
}

点。PS:点本身在正則表達式中是特殊符合

String str = "a.b.c.d.e..f";
String regex = "\\.+";//\.转义后还是.,所以再加一个\
String[] line = str.split(regex);

以叠词为切割

正则用()来封装成组

所以叠词就能够表示为,.代表随意字符。(.)封装成组,(.)\\1,代表余下都和第一组同样

String str = "a@@@b####c...dtttef";
String regex = "(.)\\1+";//
String[] line = str.split(regex);

组:((A)(B(C))),共同拥有几组,哪几组

以左括号数,

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

(A)    2

(B(C))
    3

(C)         4

无括号就是第0组



替换:

replaceAll(String regex,String
replacement)


使用给定的 replacement 替换此字符串全部匹配给定的正則表達式的子字符串。

replaceFirst(String regex,String
replacement)


使用给定的 replacement 替换此字符串匹配给定的正則表達式的第一个子字符串。

public static void check() {
//把叠词变为一个字符
String str = "abgggggcffffdggggs";
String regex = "(.)\\1+";//
str = str.replaceAll(regex, "$1");
System.out.println(str);
}

PS:美元符号在其它參数中。能够对前一个參数中的已有的正则规则的获取

	public static void check() {
//18753377511 -> 187****7511
String str = "18753377511";
String regex = "(\\d{3})\\d{4}(\\d{4})";
System.out.println(str);
str = str.replaceAll(regex, "$1****$2");
System.out.println(str);
}

获取

正则本身就是一个对象

Pattern类

指定为字符串的正則表達式必须首先被编译为此类的实例。

然后,可将得到的模式用于创建Matcher 对象,按照正則表達式,该对象能够与随意字符序列匹配。

运行匹配所涉及的全部状态都驻留在匹配器中,所以多个匹配器能够共享同一模式。

//将正则的规则进行对象的封装

//Pattern p = Pattern.compile("a*b");

//通过正则对象的matcher方法字符串相关联,获取对字符串操作的匹配器对象Matcer

//Matcher m = p.matcher("aaaab");

//通过Matcher匹配器对象的方法对字符串进行操作

//boolean b = m.matches();

Matcher类

  • matches 方法尝试将整个输入序列与该模式匹配。

  • lookingAt 尝试将输入序列从头開始与该模式匹配。

  • find 方法扫描输入序列以查找与该模式匹配的下一个子序列。

public static void check() {
String str = "ni hao,wohao,ta ye hao";
String regex = "\\b[a-z]{3}\\b";//\\b :单词边界 Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while(m.find())//想要获取,就要先找,有没有。有才干获取
{
System.out.println(m.group());
System.out.println(m.start()+" : "+m.end());//获取起始下标
}
}

练习:

将aaa...aa..aaa...bbb...b...bbb...ccc...ccc 变为 abcd

public static void test() {
String str = "aaa...aa..aaa...bbb...b...bbb...ccc...ccc";
System.out.println(str);
String regex = "\\.+";
str = str.replaceAll(regex, "");//去点
regex = "(.)\\1+";
str = str.replaceAll(regex, "$1");//去叠词
System.out.println(str);
}

排序IP地址

public static void test() {

//		String str = "192.0.0.1    127.0.0.24  3.3.3.5    150.15.3.41";
// System.out.println("ip : "+str);
// String regex = " +";
// String[] strs = str.split(regex);
//
// TreeSet<String> ts = new TreeSet<String>();//自己主动排序
// for(String s : strs){
// ts.add(s);
// }
// for(String s : ts){//这样排,是依照字符串排序
// System.out.println(s);
// } //所以在每一个ip的每段数字,就用两个0补全
String str = "192.0.0.1 127.0.0.24 3.3.3.5 150.15.3.41";
String regex = "(\\d+)";
str = str.replaceAll(regex, "00$1");
System.out.println("补0 : "+str);
regex = "0*(\\d{3})";
str = str.replaceAll(regex, "$1");
System.out.println("保留3位 : "+str);
regex = " +";
String[] strs = str.split(regex); TreeSet<String> ts = new TreeSet<String>();//自己主动排序
for(String s : strs){
ts.add(s);
}
for(String s : ts){
System.out.println(s.replaceAll("0*(\\d+)", "$1"));
}
}

邮箱地址的简单校验

public static void test() {

		String mail = "aa_a@163.com.cn";
String regex = "\\w+@\\w+(\\.[a-zA-Z]{2,3})+";//+代表一次或多次
boolean flag = mail.matches(regex);
System.out.println(mail+" : "+flag);
}

注意:开发时。正则阅读性差。会不断验证。然后封装起来



练习:网页爬虫:一个程序用于在互联网中获取符合指定规则的数据



爬取邮箱地址。

public class asd {
public static void main(String[] args) throws Exception {
//List<String> list = getmail();//本地
List<String> list = getweb();//网络
for(String i : list){
System.out.println(i);
}
} public static List<String> getweb() throws Exception{ //URL url = new URL("http://192.168.0.1:8080/myweb/mymail.html");
URL url = new URL("http://news.baidu.com/");
BufferedReader brin = new BufferedReader(new InputStreamReader(url.openStream()));
String mail_regex = "\\w+@\\w+(\\.\\w+)+";
Pattern p = Pattern.compile(mail_regex);
List<String> list = new ArrayList<String>();
String line = null;
while((line = brin.readLine())!=null){ Matcher m = p.matcher(line);
while(m.find()){
list.add(m.group());
}
}
return list;
}
public static List<String> getmail() throws Exception { //1.读取源文件
BufferedReader br = new BufferedReader(new FileReader("g:\\mymail.html"));
String mail_regex = "\\w+@\\w+(\\.\\w)+"; Pattern p = Pattern.compile(mail_regex);
List<String> list = new ArrayList<String>();
String line = null; //2.对读取的数据进行规则的匹配,从中获取符合规则的数据
while((line = br.readLine())!=null){
Matcher m = p.matcher(line);
while(m.find()){
//3.将符合规则的数据存储到集合
list.add(m.group());
}
}
return list;
}
}





JAVA学习第六十五课 — 正則表達式的更多相关文章

  1. paip.java UrlRewrite 的原理and实现 htaccess正則表達式转换

    paip.java UrlRewrite 的原理and实现 htaccess正則表達式转换 #---KEYWORD #-正則表達式 正則表達式 表示 非指定字符串开头的正则 排除指定文件夹.. 作者 ...

  2. PHP第九课 正則表達式在PHP中的使用

    今天内容 1.正則表達式 2.数学函数 3.日期函数 4.错误处理 正則表達式: 1.模式修正符 2.五个经常使用函数 另外一个正則表達式的站点:http://www.jb51.net/tools/z ...

  3. 使用正則表達式的格式化与高亮显示json字符串

    使用正則表達式的格式化与高亮显示json字符串 json字符串非常实用,有时候一些后台接口返回的信息是字符串格式的,可读性非常差,这个时候要是有个能够格式化并高亮显示json串的方法那就好多了,以下看 ...

  4. JavaScript正則表達式知识汇总

    Js 正則表達式知识汇总 正則表達式: 1.什么是RegExp?RegExp是正則表達式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegE ...

  5. iOS_正則表達式

    iOS 正則表達式 正則表達式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE).计算机科学的一个概念. 正則表達式使用单个字符 ...

  6. 辛星教你高速掌握PHP的正則表達式

    首先说一下,这篇文章也是我在看了数个大牛的博客之后总结出来的,因此首先向这些大牛表示崇高的敬意和感谢,因为人数众多.并且来源也是特别分散,就不一一介绍了,见谅. ************跨语言的主题* ...

  7. 【JavaScript】正則表達式

    正則表達式,也不是第一次与它见面了.在我们学习ASP.NET视频的时候,验证控件的那个实例中.就有提到过它. 那个时候.都是在控件的属性中自己设置的,用的原理就是正則表達式,当时得感觉就是方便,强大, ...

  8. 轻松学习之Linux教程六 正則表達式具体解释

    本系列文章由@超人爱因斯坦出品.转载请注明出处. 作者:超人爱因斯坦    个人站点:http://www.hpw123.net          文章链接:http://hpw123.net/a/L ...

  9. 轻松学习JavaScript十四:JavaScript的RegExp对象(正則表達式)

    一RegExp对象概述 RegExp对象表示正則表達式,RegExp是正則表達式的缩写.它是对字符串运行模式匹配的强大工具. RegExp 对象用于规定在文本中检索的内容. 当您检索某个文本时.能够使 ...

随机推荐

  1. 牛腩新闻发布系统(五):VS网站发布及常见问题

    导读:在千万个回眸中,终于看见了牛腩的归途.好吧,牛腩该整合的都整合完毕了,到了发布的时候了.这时候,不得不再次感慨那句不知道感慨了多少次的感慨:为什么,我要遭遇这么多的坎坷?下面,结合自己的情况,说 ...

  2. 九度oj 题目1021:统计字符

    题目描述:     统计一个给定字符串中指定的字符出现的次数. 输入:     测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过5的字符串,第2行为一个长度不超过80的字符串.注 ...

  3. RAC+单节点搭建DG

    primary RAC to single standby 参考文献:RAC+单实例DATAGUARD 配置   http://blog.csdn.net/miyatang/article/detai ...

  4. 关于JS中字符串赋值的问题

    JS中不能直接  字符串不能 str[i] = 'x'     不能for循环 字符串length 然后赋值 应该 将字符串转换为数组   而且 字符x[i]=* 不是所有浏览器都兼容的 用  spl ...

  5. BZOJ 1086 [SCOI2005]王室联邦 ——DFS

    手把手教你树分块系列. 只需要记录一个栈,如果等于B的情况就弹栈,令省会为当前节点. 然后把待分块的序列不断上传即可. 考虑到有可能弹出不是自身节点的子树节点,所以记录一下当前的栈底. DFS即可 # ...

  6. [BZOJ1595] [Usaco2008 Jan]人工湖(单调栈)

    传送门 好难的题..至少对我来说. 这题就是模拟从最低的平台注水,然后将最低的填满以后从最低的平台向两边扩展,每次找最近的最低的平台h,然后将水填到h高度. 栈里存的是向外扩展的时候,有时会遇到高度递 ...

  7. [BZOJ1592] [Usaco2008 Feb]Making the Grade 路面修整(DP)

    传送门 有个结论,每一个位置修改高度后的数,一定是原来在这个数列中出现过的数 因为最终结果要么不递增要么不递减, 不递增的话, 如果x1 >= x2那么不用动,如果x1 < x2,把x1变 ...

  8. Java:Session详解

    以下情况,Session结束生命周期,Servlet容器将Session所占资源释放:1.客户端关闭浏览器2.Session过期3.服务器端调用了HttpSession的invalidate()方法. ...

  9. Apache Sqoop - Overview Apache Sqoop 概述

    使用Hadoop来分析和处理数据需要将数据加载到集群中并且将它和企业生产数据库中的其他数据进行结合处理.从生产系统加载大块数据到Hadoop中或者从大型集群的map reduce应用中获得数据是个挑战 ...

  10. linux下面MySQL变量修改及生效

    今天在访问mysql项目的时候突然报500错误,没有找到连接,因此想到mysql的连接时间. mysql> show global variables; 主要就是连接时间是28800(8小时), ...