Java正则表达式之语法规则

[转]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个捕获组

 

时间: 2024-10-24 06:50:24

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

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

转自:http://www.cnblogs.com/lzq198754/p/5780340.html 概要: Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 2在字符串中查询字符或者字符串 3常用正则表达式 4正则表达式语法 1匹配验证-验证Email是否正确 Java | 复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public static void main(String[] args) {     // 要验证的字符串     

正则表达式的语法规则

正则表达式描述了一种字符串匹配的模式,通过这个模式在特定的函数中对字符串进行匹配.查找.替换及分割等操作.正则表达式作为一个匹配的模板,是由原子(普通字符,例如字符a到z).有特殊功能的字符(称为元字符,例如*.+和?等),以及模式修正符三部分组成的文字模式.一个最简单的正则表达式模式中,至少也要包含一个原子,如“/a/”.而且在与Perl兼容的正则表达式函数中使用的模式时,一定要给模式加上定界符,即将模式包含在两个反斜线“/”之间.一个HTML连接的正则表达式模式如下所示: ‘/<a.*?(?

java 正则表达式(语法大全)

本文转自 http://www.cnblogs.com/elleniou/archive/2012/07/31/2617312.html [正则表达式]文本框输入内容控制整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$".只能输入至少n位的数字:"^\d{n,}$".只能输入m~n位的数字:."^\d{m,n}$"只能输入零和非零开头的数字

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

概要: | |目录 1匹配验证-验证Email是否正确 2在字符串中查询字符或者字符串 3常用正则表达式 4正则表达式语法 1匹配验证-验证Email是否正确 Java | 复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public static void main(String[] args) {     // 要验证的字符串     String str = "[email protected]";     // 邮箱验证规则     String reg

java正则表达式的语法与示例 (转)

匹配验证-验证Email是否正确 public static void main(String[] args) { // 要验证的字符串 String str = "[email protected]"; // 邮箱验证规则 String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}"; // 编译正则表达式 Pattern pattern = Pattern

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

函数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表现形式则称作函数. 练习:把两个整数相加: 1 public class FunctionDemo1{ 2 public static void main(String[] args){ 3 /* 4 int a = 4+5; 5 System.out.println("a="+a); 6 int b =

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

关于Java的基本语法规则

关键字+class+类名{ 关键字+关键字+变量名 关键字+关键字+输出类型+方法名(输入类型+变量名){ } } 参数的传递:子类继承父类,父类中的属性改变,子类中调用到的父类的属性也会改变 set  get方法的到想要的类中的参数 通过传递对象变量进行改变 通过传递变量进行改变

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

原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. 正则表达式应用于程序设计语言中,首次是出现在 Perl 语言,这也让 Perl 奠定了正则表达式旗手的地位.现在,它已经深入到了所有的程序设计语言中,在程序设计语言中,正则表达式可以说是标准配置了. Java 中从 JDK 1.4 开始增加了对正则表达式的支持,至此正则表达式成为了 Java 中的基