java 正则表达

本文深入解析了正则表达式的各种元字符和限定符,包括特殊字符的使用、贪婪与非贪婪模式的区别,以及如何在Java中正确使用正则表达式。同时,介绍了正则表达式中的前瞻、后顾、负前瞻、负后顾的概念,并提供了中文匹配和模式修饰符的实例。

正则表达式(英语:Regular Expression)原属于计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里边,正则表达式通常被用来检索、替换那些符合某个模式的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,Perl,Shell,R,Java等等。

元字符

描述

\

将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。

^

匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。

$

匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。

*

匹配前面的子表达式任意次。例如,zo*能匹配“z”,“zo”以及“zoo”。*等价于{0,}。

+

匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。

?

匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。

{n}

n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。

{n,}

n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。

{n,m}

m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。

?

当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。

元字符是一个预定义的字符。

正则表达式描述
\d匹配一个数字,是 [0-9] 的简写
\D匹配一个非数字,是 [^0-9] 的简写
\s匹配一个空格,是 [ \t\n\x0b\r\f] 的简写
\S匹配一个非空格
\w匹配一个单词字符(大小写字母、数字、下划线),是 [a-zA-Z_0-9] 的简写
\W匹配一个非单词字符(除了大小写字母、数字、下划线之外的字符),等同于 [^\w]

限定符定义了一个元素可以发生的频率。

正则表达式描述举例
*匹配 >=0 个,是 {0,} 的简写X* 表示匹配零个或多个字母 X,.*表示匹配任何字符串
+匹配 >=1 个,是 {1,} 的简写X+ 表示匹配一个或多个字母 X
?匹配 1 个或 0 个,是 {0,1} 的简写X? 表示匹配 0 个或 1 个字母 X
{X}只匹配 X 个字符\d{3} 表示匹配 3 个数字,.{10}表示匹配任何长度是 10 的字符串
{X,Y}匹配 >=X 且 <=Y 个\d{1,4} 表示匹配至少 1 个最多 4 个数字
*?如果 ? 是限定符 * 或 + 或 ? 或 {} 后面的第一个字符,那么表示非贪婪模式(尽可能少的匹配字符),而不是默认的贪婪模式

Java中的反斜杠:反斜杠 \ 在 Java 中表示转义字符,这意味着 \ 在 Java 拥有预定义的含义。

这里例举两个特别重要的用法:

  • 在匹配 . 或 { 或 [ 或 ( 或 ? 或 $ 或 ^ 或 * 这些特殊字符时,需要在前面加上 \\,比如匹配 . 时,Java 中要写为 \\.,但对于正则表达式来说就是 \.
  • 在匹配 \ 时,Java 中要写为 \\\\但对于正则表达式来说就是 \\

注意:Java 中的正则表达式字符串有两层含义,首先 Java 字符串转义出符合正则表达式语法的字符串,然后再由转义后的正则表达式进行模式匹配。

表达式:[ ]与()

  • [jpg|png] 代表匹配 j 或 p 或 g 或 p 或 n 或 g 中的任意一个字符。
  • (jpg|png) 代表匹配 jpg 或 png

正则中的前瞻,后顾,负前瞻,负后顾四个概念

前瞻: exp1(?=exp2) 查找exp2前面的exp1

后顾: (?<=exp2)exp1 查找exp2后面的exp1

负前瞻: exp1(?!exp2) 查找后面不是exp2的exp1

负后顾: (?<!=exp2)exp1 查找前面不是exp2的exp1

如:b.regexp("(?<!\\\\)[\\s]*+")表示匹配前面不是\\的n(n>=0)个空格

[\\s]* 表示>=0 个空格

如:b.regexp("([^=:\\s]|(?<=\\\\)\\ |(?<=\\\\)\\=|(?<=\\\\)\\:)+")

(?<=\\\\)表示 \

表示匹配字符串以=:空格其中一个开始 或 \\ 或 \\= 或 \\: 多个

例如:b.regexp("^\\[.*?\\]$") 匹配前后[ ]

例如:b.regexp("^\\s*+\\-\\s") 匹配“   - xxxxx ”

中文匹配:

[\u4e00-\u9fa5]+ 代表匹配中文字。

可以在正则的开头指定模式修饰符:

  • (?i) 使正则忽略大小写。
  • (?s) 表示单行模式("single line mode")使正则的 . 匹配所有字符,包括换行符。
  • (?m) 表示多行模式("multi-line mode"),使正则的 ^ 和 $ 匹配字符串中每行的开始和结束。
正则表达善于处理文本,对匹配、搜索和替换等操作都有意想不到的作用。正因如此,正则表达现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率。 正则表达应用于程序设计语言中,首次是出现在 Perl 语言,这也让 Perl 奠定了正则表达旗手的地位。现在,它已经深入到了所有的程序设计语言中,在程序设计语言中,正则表达可以说是标准配置了。 Java 中从 JDK 1.4 开始增加了对正则表达的支持,至此正则表达成为了 Java 中的基本类库,使用时不需要再导入第三方的类库了。Java 正则表达的语法来源于象征着正则表达标准的 Perl 语言,但也不是完全相同的,具体的可以参看 Pattern 类的 API 文档说明。 我在一次偶然中发现了位于 java.sun.com 站点上的 Java Tutorial,也在那里看到了关于 Java正则表达教程,感觉它不同于其他的正则表达教程,文中以大量的匹配实例来进行说明。为了能让 Java 学习者能更好地使用正则表达,就将其完整地译出了。该教程中所介绍的正则表达应用仅仅是最为简单的(并没有完全地涉及到 Pattern 类支持的所有正则表达语法,也没有涉及到高级的应用),适合于从未接触过或者是尚未完全明白正则表达基础的学习者。在学习完该教程后,应该对正则表达有了初步的了解,并能熟练地运用 java.util.regex 包中的关于正则表达的类库,为今后学习更高级的正则表达技术奠定良好的基础。 教程中所有的源代码都在 src 目录下,可以直接编译运行。由于当前版本的 Java Tutorial 是基于 JDK 6.0 的,因此其中的示例程序也用到了 JDK 6.0 中的新增类库,但正则表达在 JDK 1.4 就已经存在了,为了方便大家使用,改写了部分的源代码,源代码类名中后缀为"V4"的表示用于 JDK 1.4 或以上版本,"V5"的表示用于 JDK 5.0 或以上版本,没有这些后缀的类在各个版本中均可以正常使用。 由于译者的水平和技术能力有限,译稿虽经多次校对,难免有疏漏之处,敬请大家批评和指正。若有发现不妥之处,请发送邮件至 FrankieGao123@gmail.com,我会在 blog 中进行勘误,谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值