12 问题和练习
〖问题〗
1. 在 java.util.regex 包中有哪三个公共的类?描述一下它们的作用。
2. 考虑一下字符串“foo”,它的开始索引是多少?结束索引是多少?解释一下这些编号的意思。
3. 普通字符和元字符有什么不同?各给出它们的一个例子。
4. 如何把元字符表现成像普通字符那样?
5. 附有方括号的字符集称为什么?它有什么作用?
6. 这里是三个预定义的字符类:\d
、\s
和\w
。描述一下它们各表示什么?并使用方括号的形式将它们重写。
7. 对于\d
、\s
和\w
,写出两个简单的表达式,匹配它们相反的字符集。
8. 思考正则表达式(dog){3}
,识别一下其中的两个子表达式。这个表达式会匹配什么字符串?
〖练习〗
1. 使用反向引用写一个表达式,用于匹配一个人的名字,假设这个人的 first 名字与 last 名字是相同的。
【问题答案】
1. 问:在 java.util.regex 包中有哪三个公共的类?描述一下它们的作用。
答:
- 编译后的 Pattern 实例表示正则表达式。
- Matcher 实例是解析模式和靠着输入的字符串完成匹配操作的引擎。
- PatternSyntaxException 定义一个未检查异常,指示正则表达式中的语法错误。
2. 问:考虑一下字符串“foo”,它的开始索引是多少?结束索引是多少?解释一下这些编号的意思。
答:字符串中的每一个字符位于其自身的单元格中。索引位置在两个单元格之间。字符串“foo”开始于索引 0,结束于索引 3,即便是这些字符仅占用了 0、1 和 2 号单元格。
3. 问:普通字符和元字符有什么不同?各给出它们的一个例子。
答:正则表达式中的普通字符匹配其本身。元字符是一个特殊的字符,会影响被匹配模式的方式。字母A
是一个普通字符。标点符号.
是一个元字符,其匹配任意的单字符。
4. 问:如何把元字符表现成像普通字符那样?
答:有两种方法:
- 在元字符前加上反斜线(
\
); - 把元字符置于
\Q
(开始)\E
(结束)的引用表达式中。
5. 问:附有方括号的字符集称为什么?它有什么作用?
答:是一个字符类。通过方括号间的表达式,匹配指定字符类中的任意一个字符。
6. 问:这里是三个预定义的字符类:\d
、\s
和\w
。描述一下它们各表示什么?并使用方括号的形式将它们重写。
答:\d
匹配任意数字[0-9]
\s
匹配任意空白字符[ \t\n-x0B\f\r]
\w
匹配任意单词字符[a-zA-Z_0-9]
7. 问:对于\d
、\s
和\w
,写出两个简单的表达式,匹配它们相反的字符集。
答:\d
\D
[^\d]
\s
\S
[^\s]
\w
\W
[^\w]
8. 问:思考正则表达式(dog){3}
,识别一下其中的两个子表达式。这个表达式会匹配什么字符串?
答:表达式由捕获组(dog)
和接着的贪婪量词{3}
所组成。它匹配字符串“dogdogdog”。
【练习答案】
1. 练习:使用反向引用写一个表达式,用于匹配一个人的名字,假设这个人的 first 名字与 last 名字是相同的。
解答:([A-Z][a-zA-Z]*)\s\1