黑马程序员——Java 基础 正则表达式(复习)

来源:互联网 发布:mac无法登录app store 编辑:程序博客网 时间:2024/05/18 02:10

-----------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]ab 或 c(简单类)[^abc]任何字符,除了 ab 或 c(否定)[a-zA-Z]a 到 z 或 A 到 Z,两头的字母包括在内(范围)[a-d[m-p]]a 到 d 或 m 到 p[a-dm-p](并集)[a-z&&[def]]de 或 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.Character.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)如果想要拿到符合要求的字符串子串,使用获取。获取:获取符合规则的子串




0 0
原创粉丝点击