其实基础类库下里面就一个重点:
正则表达式:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。一种规则有自己的特殊应用
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 当别人用邮箱注册时候,我们需要判断输入的是否是正确的邮箱
* * 需求:
* 邮箱格式 :
* 前面字符长度 3-20
* 必须存在一个@符号
* 其次@符号后面必须紧跟邮箱的版本:qq 163 wangyi
* 最后必须域名结尾:.com .org .xx
* 当我们要完成对一个邮箱的判断时候 普通写法一步一步来判断
* 正则表达式:"\\w{3,20}@\\w+\\.(com|org|cn|net|qov)"
* 现在还不知道这串东西什么意思,别急看效果。
*/
public class regexTestOne {
public static void main(String[] args) {
String[] mails = {
"zhangpengzhan@xiyou3g.com",
"xiaguoxin@qq.com",
"2411232428@qq.com",
"laji@.com",
"ww.com"
};
String mailRegex = "\\w{3,20}@\\w+\\.(com|org|cn|net|qov)";
Pattern mailPattern = Pattern.compile(mailRegex);
Matcher matcher = null;
for (String mail : mails){
if (matcher == null)
{
matcher = mailPattern.matcher(mail);
}
else {
matcher.reset(mail);
}
String result = mail+ (matcher.matches()? "是":"不是")+"有效的邮箱地址";
System.out.println(result);
}
}
}
运行结果:
zhangpengzhan@xiyou3g.com是有效的邮箱地址
xiaguoxin@qq.com是有效的邮箱地址
2411232428@qq.com是有效的邮箱地址
laji@.com不是有效的邮箱地址
ww.com不是有效的邮箱地址
怎么就上面那一点你看不懂得字符串完成了我们要做的一大片匹配任务,怎么说?下来详细了解一下
- 怎么说呢? 这个小东西很神奇,又有点难理解,我只能把我的一些积累分享一下下。希望大家喜欢。
- 打个比方 :我们在进行字符串处理的时候,想必大家是能简单就简单处理,毕竟敲太多处理这个的代码,很容易懵逼。比如,我要提取一段文字的电话号码,我要写一个验证QQ号的代码,我要提取一个邮箱。如果用普通的代码,相信我们会不停的加判断加循环等等。越累积越多。神他妈烦!
- 然后java就提供了正则表达式这样一个东西。只要会了这个玩意,妈的还有谁?
简单来说 正则表达式就是一个有规则的 字符串
- 这里有两个类(Pattern 和Matcher),大家在API上看一下。这两个是当我们创建好了正则表达式(字符串)用来使用它的工具
- 而且在String类里也有几个方法可以使用正则表达式
方法 | 说明 |
---|---|
boolean matches(String regex) | 判断该字符串时候匹配指定的正则表达式 |
String replaceAll(String regex ,String replacement) | 将该字符串内所有匹配regex的子串替换成replacement |
String replaceFirst(String regex ,String replacement) | 将该字符串中第一个匹配regex的子串替换成replacement |
String[] split(String regex) | 以regex为分隔符分割多个子串 |
创建正则表达式
- 说了那么多,说重点:怎么创建正则表达式
- 有以下规则我们需要记住:
-
A:字符
x 字符 x。举例:‘a’表示字符a
\ 反斜线字符。
\n 新行(换行)符 (’\u000A’)
\r 回车符 (’\u000D’) -
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括 -
预定义字符类
. 任何字符。我的就是.字符本身,怎么表示呢? .
\d 数字:[0-9]
\D 非数字
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符
\s 代表所有空白字符 包括空格 制表符 回车符 换页符 换行符
\S 非空白字符
大小写刚好反着来
在正则表达式里面组成单词的东西必须有这些东西组成 -
^ 行的开头
$ 行的结尾
\b 单词边界
就是不是单词字符的地方。
举例:hello world?haha;xixi -
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
-
"\\w{3,20}@\\w+\\.(com|org|cn|net|qov)"
这里解释一下这个正则表达式的意义:
\\代表 \ 前面的\ 用来转义
w word的意思代表单词
\w :代表所有的单词字符 可以是 数字0-9 26个英文字母 下划线
{} 前面字符出现的次数
X{n,m} X,至少 n 次,但是不超过 m 次
\w{3,20}:代表前面单词字符出现次数大于3,小于20
@ 匹配@符号 直接打出来就行。
再来一个\\w 代表 \w
\w+ :代表所有的单词字符 可以是 数字0-9 26个英文字母 下划线 可以出现一次或者多次。
\\.:代表 \.
最后以com 或者 org 或者 cn 或者 net 或者 qov结尾
这就是那么一串正则表达式的意义了
我们已经知道怎么创建正则表达式,自己多加练习就好,接下来看看怎么使用它
- Pattern对象是正则表达式编译后在内存中的表示形式,因此,正则表达式
字符串必须先被编译成Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。执行匹配的所涉及的状态保留在Matcher对象中,多个Matcher对象可共享一个Parrern对象
调用顺序:
//将一个字符串编译成Pattern对象
Pattern p = Pattern.compile(String regex);
//使用Pattern对象创建Matcher对象
Matcher m = p.matcher(String string);
boolean b = m.matches(); //返回是否匹配到
- 当我们获取到Matcher对象时候,我们就可以调用Matcher对象的各种方法了
- Matcher方法请大家查阅API文档,这里我就不一一介绍了
- 最后请大家多多练习这个,很有用。