概述

符合一定规则的表达式

专门用于操作字符串

特点:

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

所以学习正则表达式,就是在学习一些特殊符号的使用

好处:

可以简化对字符串的复杂操作

弊端:

符号定义越多,正则越长,阅读性越差

规则

下面只是一些简单的规则,具体详细规则查询API文档

Greedy 数量词
X?    X,一次或一次也没有
X*    X,零次或多次
X+    X,一次或多次
X{n}    X,恰好 n 次
X{n,}    X,至少 n 次
X{n,m}    X,至少 n 次,但是不超过 m 次
   
字符类
[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](减去)
 
预定义字符类
.    任何字符(与行结束符可能匹配也可能不匹配)
\d    数字:[0-9]
\D    非数字: [^0-9]
\s    空白字符:[ \t\n\x0B\f\r]
\S    非空白字符:[^\s]
\w    单词字符:[a-zA-Z_0-9]
\W    非单词字符:[^\w]

组和捕获

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

1        ((A)(B(C)))
2        \A
3        (B(C))
4        (C)
组零始终代表整个表达式。

Pattern与Matcher

java.util.regex包中定义了正则操作的相关对象

Pattern:正则表达式的编译表现形式,内部封装了多种正则模式

Matcher:正则匹配引擎,它是基于Pattern产生的,每个Pattern对象可与多个字符串进行匹配,所以可以产生多个匹配器Matcher

典型的调用顺序是

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

  1. 2: Matcher m = p.matcher("aaaaab");

  1. 3: boolean b = m.matches();

常见操作

String类封装的多种字符串操作其实都是基于Pattern与Matcher操作的,只不过封装起来更方便,但是功能比较单一

String类中

匹配

boolean matches(String regex)

Tells whether or not this string matches the given regular expression.

切割

String[] split(String regex)

Splits this string around matches of the given regular expression.

替换

String replaceAll(String regex, String replacement)

Replaces each substring of this string that matches the given regular expression with the given replacement.

Matcher类中

boolean matches()

Attempts to match the entire region against the pattern.

String replaceAll(String replacement)

Replaces every subsequence of the input sequence that matches the pattern with the given replacement string.

boolean find()

Attempts to find the next subsequence of the input sequence that matches the pattern.

String group()

Returns the input subsequence matched by the previous match.

实例

去叠词

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

  1. 2:

  1. 3: //去掉字符“.”

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

  1. 5: //叠词变单字

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

  1. 7: 

  1. 8: System.out.println(str);

IP排序

  1. 1: String str = "192.168.0.1 10.10.10.10 2.2.2.2 255.255.255.255";

  1. 2: 

  1. 3: //每段都加上2个0

  1. 4: str = str.replaceAll("(\\d+)","00$1");

  1. 5: 

  1. 6: //每段ip位数对齐成3位

  1. 7: str = str.replaceAll("0+(\\d{3})","$1");

  1. 8: 

  1. 9: //分段存放

  1. 10: String[] arr = str.split(" ");

  1. 11: 

  1. 12: //存放到set集合中进行字符串排序

  1. 13: TreeSet<String> ts = new TreeSet<String>();

  1. 14: 

  1. 15: for(String s : arr)

  1. 16: {

  1. 17: ts.add(s);

  1. 18: }

  1. 19: 

  1. 20: //去掉补齐的0位

  1. 21: for(String s: ts)

  1. 22: {

  1. 23: s = s.replaceAll("0+([1-9]+)","$1");

  1. 24: System.out.println(s);

  1. 25: }

  1. 26: 

  1. 27: System.out.println(args.length);

网页爬虫

  1. 1: public static void getMail() throws Exception

  1. 2: {

  1. 3: //网络上的url资源

  1. 4: URL url = new URL("http://www.cnblogs.com/feng-c-x/p/3300060.htm");

  1. 5:

  1. 6: //建立连接

  1. 7: URLConnection conn = url.openConnection();

  1. 8:

  1. 9: //封装读取流

  1. 10: BufferedReader bufr =

  1. 11: new BufferedReader(new InputStreamReader(conn.getInputStream()));

  1. 12: 

  1. 13:

  1. 14: String line = null;

  1. 15:

  1. 16: //定义正则邮箱规则

  1. 17: String regex = "\\w+@\\w+(\\.\\w+){1,3}";

  1. 18:

  1. 19: //编译成正则对象

  1. 20: Pattern p = Pattern.compile(regex);

  1. 21:

  1. 22: //遍历查找邮箱字符串

  1. 23: while( (line = bufr.readLine()) != null)

  1. 24: {

  1. 25: Matcher m = p.matcher(line);

  1. 26: 

  1. 27: while(m.find())

  1. 28: {

  1. 29: System.out.println(m.group());

  1. 30: }

  1. 31: }

  1. 32: }

Java笔记(三十)……正则表达式的更多相关文章

  1. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

  2. Java进阶(三十八)快速排序

    Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...

  3. Java进阶(三十六)深入理解Java的接口和抽象类

    Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...

  4. Java进阶(三十五)java int与integer的区别

    Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...

  5. Java进阶(三十四)Integer与int的种种比较你知道多少?

    Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...

  6. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  7. angular学习笔记(三十)-指令(10)-require和controller

    本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...

  8. angular学习笔记(三十)-指令(7)-compile和link(2)

    继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...

  9. angular学习笔记(三十)-指令(7)-compile和link(1)

    这篇主要讲解指令中的compile,以及它和link的微妙的关系. link函数在之前已经讲过了,而compile函数,它和link函数是不能共存的,如果定义了compile属性又定义link属性,那 ...

随机推荐

  1. CSS display:inline和float:left两者区别探讨

     本文和大家重点讨论一下CSS display:inline和float:left两者的区别,CSS display是指显示状态,inline表示内联,特点是紧贴着前一个内联元素,通常默认的内联元素有 ...

  2. sql server触发器的例子

    发布:thebaby   来源:脚本学堂     [大 中 小] 本文介绍下,在sql server数据库中使用触发器的简单例子,有需要的朋友可以参考下,希望对你有一定的帮助. 原文地址:http:/ ...

  3. 挑战Python-20160826

    给你一字典a,如a={1:1,2:2,3:3},输出字典a的key,以','链接,如‘1,2,3'.

  4. TypeScript学习指南--目录索引

    关于TypeScript: TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程. TypeS ...

  5. firefox浏览器删除插件

    打开注册表编辑器([开始菜单]→[运行]或 Win+R快捷键打开运行,输入regedit). 2 点击菜单栏[编辑]→[搜索],或者按 Ctrl + F 快捷键,搜索 MozillaPlugins . ...

  6. [CC150] Get all permutations of a string

    Problem: Compute all permutations of a string of unique characters. 此题用循环的方式不好做,下面是一种递归的思路: 把给的字符串看成 ...

  7. MongoDB服务器启动异常 1067

    删掉mongod.lock文件就重启就可以了.

  8. linux hosts一个诡异问题

    最近部署环境时遇到一个古怪问题. 背景环境: tomcat服务器 :  192.168.13.78 简称t 依赖服务器 :  192.168.12.159 简称s 二者关系 :t服务器的tomcat应 ...

  9. [Gauss]POJ2947 Widget Factory

    题意: 有n种小工具要加工,每种工具的加工时间为3到9天,给了m条加工记录.  每条记录 X $s_1$ $s_2$ 分别代表 这个工人在$s_1$到$s_2$(前闭后闭)的时间里加工了X件小工具   ...

  10. Google的代码风格规范,各种语言都很全

    https://code.google.com/p/google-styleguide/