黑马程序员——Java 基础 正则表达式(复习)
2015-08-28 19:21
573 查看
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
一、理解正则表达式
1.什么是正则表达式?
可以简单的理解为符合一定规则的表达式。
2.正则表达式能干什么?
正则表达式专门用来操作字符串。简化对字符串的复杂操作。
正则表达式是用一些特定的符号来表示一些代码操作
先看一个代码示例:对邮箱格式进行校验
import java.util.*;
class RegexTest
{
public static void main(String[] args)
{
checkMail();
}
/*
需求:对邮件地址进行校验。
*/
public static void checkMail()
{
String mail = "abc12@sina.com";
mail = "1@1.1";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。
System.out.println(mail.matches(reg));
}
}
可以看到我们学习正则表达式regex,就是学习一些特定的符号的使用。
3.正则表达式有哪些特殊的符号呢?
正则表达式常用构造摘要
4.正则表达式的具体功能
(1)匹配
通过String类中的 boolean matches(regex); 方法,如果返回为true 表示符合规则,反之则不符合规则。
(2)切割
通过String类中的 String[ ] Split(regex); 方法,返回一个String数组。
(3)替换
通过String replaceAll(regex,replacement) 将一个字符串中符合规则的部分,用新的字符串(replacement) 来替换掉。
(4)获取:将字符串中符合规则的子串取出
操作步骤:
1)将正则表达式封装成对象
2)让正则对象与要操作的字符串相关联
3)关联后,获取正则匹配引擎
4)通过引擎对符合规则的子串进行操作,比如取出。
注意:正则表达式中“组”的概念:组 用()表示,当有叠词时可以使用。
例如:叠词 kk 用表达式可以表示为 “(.)\\1”
$符号:可以获取前一个规则中的组。
5.如何将正则表达式封装成对象?
Pattern 类:可以描述正则表达式规则。该类无构造方法,不能new对象。
(1)那么如何来将规则封装成对象呢?
可以通过static compile(String reg);方法。该方法将给定的正则表达式编译到模式中。而且该方法时静态的,可以被类名直接调用,返回的是一个Pattern类型对象。
例: Pattern p = pattern.compile(reg);
(2)让正则对象和要操作的字符串相关联,获取匹配器对象。
Matcher m = p.matcher(str); 其中matcher 就是匹配器或者成为引擎。
其实,String类中的matches方法,用的就是Pattern和Matcher对象来完成的。只不过被String 的方法封装后,用起来较为简单,但是功能单一。
m.find(); 将规则作用到字符串上,并进行符合规则的字符串查找,返回值是boolean类型的。
m.group(); 获取匹配后的结果。
6.正则表达式的利弊
好处:可以简化对字符串的复杂操作
弊端:符号定义的越多,正则越长,阅读性越差
7.如何确定用四种功能中的哪一个?或哪几个呢?
思路:
(1)如果只想知道该字符串是对是错,使用匹配
(2)如果想要将已有的字符串变成另一个字符串,使用替换
(3)如果想要按照自定义的方式将字符串变成多个字符串,使用切割。切割:获取规则以外的子串
(4)如果想要拿到符合要求的字符串子串,使用获取。获取:获取符合规则的子串
一、理解正则表达式
1.什么是正则表达式?
可以简单的理解为符合一定规则的表达式。
2.正则表达式能干什么?
正则表达式专门用来操作字符串。简化对字符串的复杂操作。
正则表达式是用一些特定的符号来表示一些代码操作
先看一个代码示例:对邮箱格式进行校验
import java.util.*;
class RegexTest
{
public static void main(String[] args)
{
checkMail();
}
/*
需求:对邮件地址进行校验。
*/
public static void checkMail()
{
String mail = "abc12@sina.com";
mail = "1@1.1";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。
System.out.println(mail.matches(reg));
}
}
可以看到我们学习正则表达式regex,就是学习一些特定的符号的使用。
3.正则表达式有哪些特殊的符号呢?
正则表达式常用构造摘要
字符 | |
---|---|
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 的控制符 |
字符类 | |
[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](减去) |
预定义字符类 | |
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
POSIX 字符类(仅 US-ASCII) | |
\p{Lower} | 小写字母字符:[a-z] |
\p{Upper} | 大写字母字符:[A-Z] |
\p{ASCII} | 所有 ASCII:[\x00-\x7F] |
\p{Alpha} | 字母字符:[\p{Lower}\p{Upper}] |
\p{Digit} | 十进制数字:[0-9] |
\p{Alnum} | 字母数字字符:[\p{Alpha}\p{Digit}] |
\p{Punct} | 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
\p{Graph} | 可见字符:[\p{Alnum}\p{Punct}] |
\p{Print} | 可打印字符:[\p{Graph}\x20] |
\p{Blank} | 空格或制表符:[ \t] |
\p{Cntrl} | 控制字符:[\x00-\x1F\x7F] |
\p{XDigit} | 十六进制数字:[0-9a-fA-F] |
\p{Space} | 空白字符:[ \t\n\x0B\f\r] |
java.lang.Character 类(简单的 java 字符类型) | |
\p{javaLowerCase} | 等效于 java.lang.Ch 4000 aracter.isLowerCase() |
\p{javaUpperCase} | 等效于 java.lang.Character.isUpperCase() |
\p{javaWhitespace} | 等效于 java.lang.Character.isWhitespace() |
\p{javaMirrored} | 等效于 java.lang.Character.isMirrored() |
Unicode 块和类别的类 | |
\p{InGreek} | Greek 块(简单块)中的字符 |
\p{Lu} | 大写字母(简单类别) |
\p{Sc} | 货币符号 |
\P{InGreek} | 所有字符,Greek 块中的除外(否定) |
[\p{L}&&[^\p{Lu}]] | 所有字母,大写字母除外(减去) |
边界匹配器 | |
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
(1)匹配
通过String类中的 boolean matches(regex); 方法,如果返回为true 表示符合规则,反之则不符合规则。
(2)切割
通过String类中的 String[ ] Split(regex); 方法,返回一个String数组。
(3)替换
通过String replaceAll(regex,replacement) 将一个字符串中符合规则的部分,用新的字符串(replacement) 来替换掉。
(4)获取:将字符串中符合规则的子串取出
操作步骤:
1)将正则表达式封装成对象
2)让正则对象与要操作的字符串相关联
3)关联后,获取正则匹配引擎
4)通过引擎对符合规则的子串进行操作,比如取出。
注意:正则表达式中“组”的概念:组 用()表示,当有叠词时可以使用。
例如:叠词 kk 用表达式可以表示为 “(.)\\1”
$符号:可以获取前一个规则中的组。
5.如何将正则表达式封装成对象?
Pattern 类:可以描述正则表达式规则。该类无构造方法,不能new对象。
(1)那么如何来将规则封装成对象呢?
可以通过static compile(String reg);方法。该方法将给定的正则表达式编译到模式中。而且该方法时静态的,可以被类名直接调用,返回的是一个Pattern类型对象。
例: Pattern p = pattern.compile(reg);
(2)让正则对象和要操作的字符串相关联,获取匹配器对象。
Matcher m = p.matcher(str); 其中matcher 就是匹配器或者成为引擎。
其实,String类中的matches方法,用的就是Pattern和Matcher对象来完成的。只不过被String 的方法封装后,用起来较为简单,但是功能单一。
m.find(); 将规则作用到字符串上,并进行符合规则的字符串查找,返回值是boolean类型的。
m.group(); 获取匹配后的结果。
6.正则表达式的利弊
好处:可以简化对字符串的复杂操作
弊端:符号定义的越多,正则越长,阅读性越差
7.如何确定用四种功能中的哪一个?或哪几个呢?
思路:
(1)如果只想知道该字符串是对是错,使用匹配
(2)如果想要将已有的字符串变成另一个字符串,使用替换
(3)如果想要按照自定义的方式将字符串变成多个字符串,使用切割。切割:获取规则以外的子串
(4)如果想要拿到符合要求的字符串子串,使用获取。获取:获取符合规则的子串
相关文章推荐
- 黑马程序员--oc类与对象的练习题
- 我要嫁给一个程序员你们怎么看?
- 程序员如何高效阅读
- 张逸:ThoughtWorks(中国)程序员读书雷达
- 程序员在职业生涯中如何规划自己
- 专访李运华:程序员如何在技术上提升自己
- 黑马程序员——Java之常用API
- 【转】最全前端面试问题及答案总结
- 大数据面试常见问题解答
- 黑马程序员 IO流(一)
- 黑马程序员——Java之this和static关键字解析
- 敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的UML概述
- iOS面试题 02
- 面试题:查询部门工资排前三的员工信息
- 程序员面试经典源代码
- 知识点总结: Java 面试宝典 2013版(超长版) - Java 基础部分
- 为什么面试喜欢问算法问题
- 100个 iOS 程序员面试题汇总
- 黑马程序员-----Java基础-----正则表达式
- 程序员如何持续提升自己的开发技能