很久以前,正则表达式就已经整合到标准Unix工具集之中,例如sed和awk,以及程序设计语言之中了,例如Python和Perl。而在JAVA中,字符串操作还主要集中于String、StringBuffer和StringTokenizer类。与正则表达式相比较,他们只能提供相当简单的功能。
基础
- 一般来说,正则表达式就是以某种方式描述字符串,因此你可以说:“如果一个字符串含有这些东西,那么它就是我正在找的东西。”例如,要找一个数字,它可能有一个负号在最前面,那你就写一个负号加上一个问号,就像这样:
-?
要描述一个整数,你可以说它有一位或多位阿拉伯数字。在正则表达式中,用\d
表示一位数字。如果在其他语言中使用过正则表达式,那你立刻就能发现Java对反斜杠\
的不同处理。在其他语言中,\\
表示“我想要在正则表达式中插入一个普通的(字面上的)反斜线,请不要给它任何特殊意义。”而在Java中,\\
的意思是“我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。”例如,如果你想表示一个数字,那么正则表达式应该是\\d
。如果你想插入一个普通的反斜线,则应该这样\\\\
。不过换行和制表符之类的东西只需要使用单反斜线:\n\t
。 - 要表示“一个或多个之前的表达式”,应该使用
+
。所以,如果要表示“可能有一个负号后面跟着一位或多位数字”,可以这样:-?\\d+
- String类还自带了一个非常有用的正则表达式工具——
split()
方法,其功能是“将字符串从正则表达式匹配的地方切开。”
创建正则表达式
- 我们首先从正则表达式可能存在的构造集中选取一个很有用的子集,以此开始学习正则表达式。正则表达式的完整构造子列表,请参考JDK文档
java.util.regex
包中的Pattern
类。 [Pattern]
量词
- 量词描述一个模式吸收输入文本的方式:
- 贪婪型:量词总是贪婪的,除非有其他的选项被设置。贪婪表达式会为所有可能的模式发现尽可能多的匹配。导致此问题的一个典型理由就是假定我们的模式仅能匹配第一个可能的字符组,如果它是贪婪的,那么它就会继续往下匹配。
- 勉强型:用问号来指定,这个量词匹配满足模式所需的最少字符数。因此也称作懒惰的、最少占匹配的、非贪婪的或不贪婪的。
- 占有型:目前,这种类型的量词只有在Java语言中才可用(其他语言中不可用),并且也更高级,因此我们大概不会立刻用到它。当正则表达式被应用于字符串时,它会产生相当多的状态,以便在匹配失败时可以回溯。而“占有的”量词并不保存这些中间状态,因此它们可以防止回溯。它们常常用于防止正则表达式时空,因此可以使正则表达式执行起来更有效。
Pattern和Matcher
split()
替换操作
reset()
正则表达式与Java I/O
参考文献:
- 《Think in Java(4 Edtion)》