Java回炉学习(十二)
1. 正则表达式
- 基本介绍:一个正则表达式,就是用某种模式去匹配字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用,不过,经过练习后,就觉得这些复杂的表达式写起来还是相当简单的,而且,一旦你弄懂它们,你就能把数小时辛苦而且易错的文本处理工作缩短在几分钟(甚至几秒钟)内完成
.group
原理:
2. 正则表达式语法
-
元字符( Metacharacter)-转义号 \\ 符号说明:在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的。案例:用 去 匹 配 " a b c 去匹配"abc 去匹配"abc(" 会怎样?
-
在Java的正则表达式中,两个\代表其他语\。
-
需要用到转义符号的字符有以下:
.*+()$/\?[]^{}
-
在匹配某个字符串的时候是选择性的,即:既可以匹配这个,又可以匹配那个,这时你需要用到选择匹配符号
|
-
用于指定其前面的字符和组合项连续出现多少次:
- 定位符,规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置,这个也是相当有用的,必须掌握
3. 分组
(pattern)
:非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从1开始自动编号。(?<name> pattern)
:命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如(?‘name’)(?:pattern)
:匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符(|)组合模式部件的情况很有用。例如,'industr(?:ylies) 是比"industrylindustries更经济的表达式。(?=pattern)
:它是个非捕获匹配。 例如,'Windows ?=95|98|NT|2000) 匹配"Windows 2000"中的"Windows",但不四配"Windows 3.1"中的"Windows"。(?!pattern)
:该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。它是一个非捕获匹配。例如,Windows (?!95|98|NT|2000)'匹配"Windows 3.1"中的"Windows",但不四配"Windows 2000"中的"Windows"。
4. java.util.regex
-
Pattern类:
pattern对象是一个正则表达式对象。Pattern类没有公共构造方法。要创建一 个Pattern对象,调用其公共静态方法,它返回一个Pattern对象。该方法接受一个正则表达式作为它的第个参数, 比如:
Pattern r = Pattern.compile(pattern);
-
Matcher类:
Matcher对象是对输入字符串进行解释和匹配的引擎。与Pattern类样,Matcher也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象。
-
PatternSyntaxException类:
PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
5. 分组、捕获、反向引用
- 分组:我们可以用圆括号组成一个比较复杂的匹配模式, 那么个圆括号的部分我们可以看作是一个子表达式/一个分组。
- 捕获:把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式的组里,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。组0代表的是整个正则式
- 反向引用:圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,内部反向引用 1分组号,外部反向引用$分组号