您的位置:首页 > 职场人生

黑马程序员——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.正则表达式有哪些特殊的符号呢?
正则表达式常用构造摘要

字符
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输入的结尾
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)如果想要拿到符合要求的字符串子串,使用获取。获取:获取符合规则的子串
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: