Java正则表达式之语法规则
正则表达式是一种强大而灵活的文本处理工具,使用正则表达式能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。一旦找到了匹配这些模式的部分,就能够随心所欲地它们进行处理。正则表达式提供了一种完全通用的方式,能够解决各种字符串处理相关的问题:匹配、选择、编辑以及验证。
首先看一下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_LINES、DOTALL、MULTILINE都是在类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正则表达式之语法规则的更多相关文章
- Java正则表达式的语法与示例
Java正则表达式的语法与示例 java 正则表达式 正则表达式语法 java正则表达式语法 java正则表达式 概要: Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 ...
- (转)Java正则表达式的语法与示例
转自:http://www.cnblogs.com/lzq198754/p/5780340.html 概要: Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 2在字符串 ...
- 【Java学习笔记之七】java函数的语法规则总结
函数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表现形式则称作函数. ...
- php中正则表达式的语法规则
- java正则表达式语法详解及其使用代码实例
原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. ...
- java正则表达式详细总结
Java 提供了功能强大的正则表达式API,在java.util.regex 包下.本教程介绍如何使用正则表达式API. 正则表达式 一个正则表达式是一个用于文本搜索的文本模式.换句话说,在文本中搜索 ...
- java正则表达式
java正则表达式 1.Java正则表达式的语法与示例: http://baike.xsoftlab.net/view/207.html 2.Java 正则表达式: http://www.runo ...
- Java基础-正则表达式(Regular Expression)语法规则简介
Java基础-正则表达式(Regular Expression)语法规则简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正则表达式的概念 正则表达式(Regular Exp ...
- 【转】详解Java正则表达式语法
(转自: http://www.jb51.net/article/76354.htm) 这篇文章主要介绍了Java正则表达式语法,包括常用正则表达式.匹配验证-验证Email是否正确以及字符串中查询字 ...
随机推荐
- 深入了解linux下的last命令及其数据源
http://www.9usb.net/200902/linux-last.html http://blog.csdn.net/chaofanwei/article/details/11826567
- oracle 密码忘记 找回密码
生活中,容易忘记Oracle数据库system用户的密码,怎么办呢,小生带你一步步重新登上Oracle ,及时你密码忘记了. 1.打开cmd窗口,输入 sqlplus / as sysdba 2.运行 ...
- yum downloadonly
有些时候集群中的机器无法联网,通过yum进行安装,这样就需要找一个相同内核的机器将rpm下载后再到相应的机器上进行安装,以解决这一问题. yum 有相应的工具完成这一任务. ...
- Haproxy安装及配置
1.安装 # wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.20.tar.gz # tar zcvf haproxy-1.3.20.t ...
- SPRING IN ACTION 第4版笔记-第九章Securing web applications-011-把敏感信息请求转为https(requiresChannel())
1.把包含敏感信息的请求转为https请求,则较为安全,但如何只把有需要安全的请求转为https,而不是不加分辩就把所有请求都转为https呢?可以用requiresChannel() @Overri ...
- 【重走Android之路】【路线篇(一)】路线图
总结归纳了J2SE和Android的知识点,自己制订了一套详细的路线图,其中肯定有考虑不全和不合适的地方,欢迎各位大牛批评指正. 详细路线图如下:
- MyBatis主键返回
在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能. 比如在表的关联关系中,将数据插入主 ...
- IOS 改变导航栏返回按钮的标题
IOS 改变导航栏返回按钮的标题 下午又找到了一个新的方法 这个方法不错 暂时没有发现异常的地方. 新写的App中需要使用UINavigationController对各个页面进行导航,但由于第一 ...
- Android之网络请求库
自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个.本篇文章对常见的网络请求库进行一个总结. HttpUrlConnection ...
- C#图片切割、图片压缩、缩略图生成
C#图片切割.图片压缩.缩略图生成的实现代码 /// 图片切割函数 /// </summary> /// <param name="sourceFile"&g ...