正则表达式是一种强大而灵活的文本处理工具,使用正则表达式能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。一旦找到了匹配这些模式的部分,就能够随心所欲地它们进行处理。正则表达式提供了一种完全通用的方式,能够解决各种字符串处理相关的问题:匹配、选择、编辑以及验证。

首先看一下JAVA中正则表达式的完整构造集,也可以参考java.util.regex.Pattern中的API说明。

字符

X

字符X

\\

反斜线字符

\0n

带有八进制值0的字符n(0<=n<=7)

\0nn

带有八进制值0的字符nn(0<=n<=7)

\0mnn

带有八进制值0的字符mnn(0<=m<=3、0<=n<=7)

\xhh

带有十六进制值0x的字符hh

\uhhhh

带有十六进制值0x的字符hhhh

\t

制表符('\u0009')

\n

新行(换行)符 ('\u000A')

\r

回车符('\u000D')

\f

换页符('\u000C')

\a

报警(bell)符('\u0007')

\e

转义符('\u001B')

\cx

对应于x的控制符

以上是字符的正则表达式,比如字符A在正则表达式的表示方式就是A,反斜线的正则表达式则为\\,所以如果想表示普通的\,正则表达式为\\\\。反斜线字符 ('\') 用于引用转义构造,如上表所定义的,同时还用于引用其他将被解释为非转义构造的字符。因此,表达式 \\ 与单个反斜线匹配,而 \{ 与左括号匹配。

在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否非转义构造的一部分。

根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b"与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。

下面则为字符类的正则表达式,其表达的含义都比较直观明了。

字符类

[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](减去)

Java还预定义了一些字符类,这些字符类在正则表达式中可以直接使用,提供了简单方便的使用方式。

预定义字符类

点号(.)

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

\d

数字:[0-9]

\D

非数字:[^0-9]

\s

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

\S

非空白字符:[^\s]

\w

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

\W

非单词字符:[^\w]

其中行结束符是一个或两个字符的序列,标记输入字符序列的行结尾。以下代码被识别为行结束符:

·          新行(换行)符('\n')、

·          后面紧跟新行符的回车符 ("\r\n")、

·          单独的回车符 ('\r')、

·          下一行字符 ('\u0085')、

·          行分隔符 ('\u2028') 或

·          段落分隔符 ('\u2029)。

如果激活 UNIX_LINES 模式,则新行符是唯一识别的行结束符。

如果未指定 DOTALL 标志,则正则表达式 点号(.)可以与任何字符(行结束符除外)匹配。

默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配。如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配。处于 MULTILINE 模式中时,$ 仅在行结束符之前或输入序列的结尾处匹配。上面的 UNIX_LINESDOTALLMULTILINE都是在类Pattern中定义的常量,在方法compile(String regex,int flags)中指定编译模式。

边界匹配器

^

行的开头

$

行的结尾

\b

单词边界

\B

非单词边界

\A

输入的开头

\G

上一个匹配的结尾

\Z

输入的结尾,仅用于最后的结束符(如果有的话)

\z

输入的结尾

量词描述了一个模式吸收输入文本的方式,可以分为:贪婪型、勉强型和占有型。贪婪型表达式会为所有可能的模式发现尽可能多的匹配,勉强型用问号来指定,匹配满足模式所需的最少字符数,占用型只用在Java语言中才可用,当正则表达式被应用于字符串时,会产生相当多的状态以便在匹配失败时可以回溯。除非指定其它类型,否则量词总是贪婪型的。

贪婪型

勉强型

占有型

如何匹配

X?

X??

X?+

一个或零个X

X*

X*?

X*+

零个或多个x

X+

X+?

X++

一个或多个X

X{n}

X{n}?

X{n}+

恰好n次X

X{n,}

X{n,}?

X{n,}+

至少n次X

X{n,m}

X{n,m}?

X{n,m}+

X至少n次,且不超过m次

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

1    

((A)(B(C)))

2    

\A

3    

(B(C))

4    

(C)

组零始终代表整个表达式。

之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过\引用在表达式中使用,也可以在匹配操作完成后从匹配器获取。与组关联的捕获输入始终是与组最近匹配的子序列。

以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。

逻辑运算符

XY

X后跟Y

X|Y

X或Y

(X)

X作为捕获组,可以在表达式中用\i引用第i个捕获组

 

Java正则表达式之语法规则的更多相关文章

  1. Java正则表达式的语法与示例

    Java正则表达式的语法与示例 java 正则表达式 正则表达式语法 java正则表达式语法 java正则表达式 概要: Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 ...

  2. (转)Java正则表达式的语法与示例

    转自:http://www.cnblogs.com/lzq198754/p/5780340.html 概要: Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 2在字符串 ...

  3. 【Java学习笔记之七】java函数的语法规则总结

    函数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表现形式则称作函数. ...

  4. php中正则表达式的语法规则

  5. java正则表达式语法详解及其使用代码实例

    原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. ...

  6. java正则表达式详细总结

    Java 提供了功能强大的正则表达式API,在java.util.regex 包下.本教程介绍如何使用正则表达式API. 正则表达式 一个正则表达式是一个用于文本搜索的文本模式.换句话说,在文本中搜索 ...

  7. java正则表达式

    java正则表达式 1.Java正则表达式的语法与示例:  http://baike.xsoftlab.net/view/207.html 2.Java 正则表达式:  http://www.runo ...

  8. Java基础-正则表达式(Regular Expression)语法规则简介

    Java基础-正则表达式(Regular Expression)语法规则简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正则表达式的概念 正则表达式(Regular Exp ...

  9. 【转】详解Java正则表达式语法

    (转自: http://www.jb51.net/article/76354.htm) 这篇文章主要介绍了Java正则表达式语法,包括常用正则表达式.匹配验证-验证Email是否正确以及字符串中查询字 ...

随机推荐

  1. 浅谈Spark Kryo serialization

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3833985.html 最近在使用spark开发过程中发现当数据量很大时,如果cache数据将消耗很多的内 ...

  2. YARN集群维护部分问题汇总

    云梯开发人员在云梯Yarn集群的搭建和维护过程中做了许多工作,本文选择这期间部分较为典型的问题,通过对这些问题的分析和解决方案,为大家分享分布式系统问题调查的经验. 调查的问题 1. 2013年初引入 ...

  3. PHP页面跳转几种实现技巧

    PHP被许多程序员用来开发WEB的首选语言.在实际开发中,网站的各项功能都可以通过PHP语言的编写来满足,比如PHP页面跳转这一方法. 探讨PHP变量解析顺序如何获取提交数据 深入解读PHP运行机制 ...

  4. 【web性能】页面呈现、重绘、回流

    在讨论页面重绘.回流之前.需要对页面的呈现流程有些了解,页面是怎么把html结合css等显示到浏览器上的,下面的流程图显示了浏览器对页面的呈现的处理流程.可能不同的浏览器略微会有些不同.但基本上都是类 ...

  5. linux查询cpu核心数

    linux怎么查询cpu核心数 1.查看逻辑CPU个数: #cat /proc/cpuinfo |grep "processor"|sort -u|wc -l24 2.由于有超线程 ...

  6. 获取CentOS系统详情的九个uname命令实例

    当你在控制台模式下,无法通过“鼠标右键 > 关于”获取操作系统的信息.这时,在Linux下,你可以使用uname命令,帮助你完成这些工作. Uname是unix name的缩写.在控制台中实际使 ...

  7. linux 大量的TIME_WAIT解决办法

    发现存在大量TIME_WAIT状态的连接tcp        0      0 127.0.0.1:3306              127.0.0.1:41378             TIME ...

  8. Partitioner

    partitioner 是map中的数据映射到不同的reduce时的根据.一般情况下,partitioner会根据数据的key来把数据平均分配给不同的reduce,同时保证相同的key分发到同一个re ...

  9. libevent系列文章

    Libevent 2 提供了 bufferevent 接口,简化了编程的难度,bufferevent 实际上是对底层事件核心的封装,因此学习 bufferevent 的实现是研究 Libevent 底 ...

  10. 解决 iReport 生成 pdf 时显示不出中文的问题

    有没有遇到这样的情况:在使用 iReport 做报表时,用pdf预览显示不出中文? 解决步骤是这样的: 1.加入jar包 下载两个jar包:itextasian.jar 和 itext-x.y.jar ...