正则表达式
大约 7 分钟
正则表达式是含有一些具有特殊意字符的字符序列
正则表达式有三个主要用途:
- 模式验证: 检测某个字符串是否符合规则,如手机号、身份证号等
- 匹配读取: 将目标字符串中满足规则的部分 读取 出来,如将整段文本中的邮箱地址读取出来()
- 匹配替换: 将目标字符串中满足标准的部分 替换 为其他字符串,如将整段文本中的 "hello" 替换成 "haha"
Java 中 String 类用到正则表达式的方法:
方法 | 描述 |
---|---|
String replaceAll(String regex, String replacement) | 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 |
String replaceFirst(String regex, String replacement) | 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串 |
boolean matches(String regex) | 告知此字符串是否匹配给定的正则表达式 |
String[] split(String regex) | 根据给定正则表达式的匹配拆分此字符串 |
String[] split(String regex, int limit) | 根据匹配给定的正则表达式来拆分此字符串,最多不超过 limit 个,如果超过了,剩下的全部都放到最后一个元素中 |
Java 中 StringTokenizer 类用到正则表达式方法
StringTokenizer(String str,String delim)
:为字符串 str 构造一个 tokenizer 对象,分隔标记为 delim 中的字符
Java 中 Pattern 类 Matcher 类中用到正则表达式的方法
Pattern.compile(regex);
正则表达式的使用三步骤:
- 定义正则表达式的对象
- 定义带校验字符串
- 校验
1、元字符
在正则表达式中被赋予特殊含义的字符,不能被直接当做普通字符使用。
如果要匹配元字符本身,需要对元字符进行转义,转义的方式是在元字符前面加上 \
如:\^
元字符 | 说明 |
---|---|
. | 任何一个字符,除换行符外 |
\w | 匹配字母或数字或下划线等价于 [a-zA-Z0-9_] |
\W | 匹配任何非单词字符。等价于 [^A-Za-z0-9_] |
\d | 匹配数字。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9] |
\s | 匹配任意空白符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^\f\n\r\t\v]。 |
\p{Lower} | 小写字母[a-z] |
\p{Upper} | 大写字母[A-Z] |
\p{ASCII} | ASCII 字符 |
\p{Alpha} | 字母 |
\p{Digit} | [0-9] |
\p{Alnum} | 字母或数字 |
\p{Punct} | 标点符号 |
\p{Blank} | 空格或制表符[\t] |
\p{Cntrl} | 控制字符[\x00-\x1F\x7F] |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始,但在 [] 中使用表示取反 |
$ | 匹配字符串的结束 |
相关信息
上述元字符在 java 表达式中的写法除 .
为 .
,其余都是在原本的字符前加一个「\」,如 \\w
Pattern pattern = Pattern.compile("\\w");
Matcher matcher = pattern.matcher("a?b-_1");
while (matcher.find()){ System.out.print(matcher.group() + " ");} // a b _ 1
Pattern pattern = Pattern.compile("\\W");
Matcher matcher = pattern.matcher("a?b-_1");
while (matcher.find()){ System.out.print(matcher.group() + " ");} // ? -
Pattern pattern = Pattern.compile("\\p{Lower}");
Matcher matcher = pattern.matcher("a?b-_1");
while (matcher.find()){ System.out.print(matcher.group() + " ");} // a b
2、字符集合
语法格式 | 示例 |
---|---|
[abc] | 包含 abc 中的任何一个字符 |
[^abc] | 包含除了 abc 中的任何一个字符 |
[a-zA-Z] | 包含任何英文字母 |
[a-d] | 包含 a-d 任何一个字符 |
[a-d[m-p]] | 包含 a-d 或 m-p 中任何字母(并) |
[a-z&&[def]] | 包含 def 中的任何一个(交) |
[a-f&&[^bc]] | 包含 adef 中任何一个 |
3、限定符
代码 | 说明 |
---|---|
X* | X 出现零次或多次 |
X+ | X 出现一次或多次 |
X? | X 出现零次或一次 |
X{n} | X 出现 n 次 |
X{n,} | X 出现 n 次或多次 |
X{n,m} | X 出现 n 到 m 次 |
XY | X 的后缀是 Y |
X|Y | X 或 Y |
4、创建正则表达式
var reg = new RegExp("正则表达式");
// 或
var reg = /正则表达式/
String regex = "正则表达式";
5、正则表达式案例
校验字符串中是否包含 o 字母
// 创建一个最简单的正则表达式对象
var reg = /o/;
// 创建一个字符串对象作为目标字符串
var str = 'Hello World!';
// 调用正则表达式对象的test()方法验证目标字符串是否满足我们指定的这个模式,返回结果true
console.log("字符串中是否包含'o'=" + reg.test(str));
匹配读取
读取字符串中的所有 o(全局匹配,对应所有匹配到的字符)
//匹配读取: 读取一个字符串中的所有'l'字母
// g表示全文查找,如果不使用g那么就只能查找到第一个匹配的内容
//1. 编写一个正则表达式
var reg2 = /l/g
//2. 使用正则表达式去读取字符串
var arr = str.match(reg2);
console.log(arr)
匹配替换
将字符串中的第一个 o 替换成 '@'
var newStr = str.replace(reg,'@');
// 只有第一个o被替换了,说明我们这个正则表达式只能匹配第一个满足的字符串
console.log("str.replace(reg)="+newStr);//Hell@ World!
// 原字符串并没有变化,只是返回了一个新字符串
console.log("str="+str);//str=Hello World!
全文查找
如果不使用 g 对正则表达式对象进行修饰,则使用正则表达式进行查找时,仅返回第一个匹配;使用 g 后,返回所有匹配。
// 目标字符串
var targetStr = 'Hello World!';
// 没有使用全局匹配的正则表达式
var reg = /[A-Z]/;
// 获取全部匹配
var resultArr = targetStr.match(reg);
// 数组长度为1
console.log("resultArr.length="+resultArr.length);
// 遍历数组,发现只能得到'H'
for(var i = 0; i < resultArr.length; i++){
console.log("resultArr["+i+"]="+resultArr[i]);
}
对比代码:
// 目标字符串
var targetStr = 'Hello World!';
// 使用了全局匹配的正则表达式
var reg = /[A-Z]/g;
// 获取全部匹配
var resultArr = targetStr.match(reg);
// 数组长度为2
console.log("resultArr.length="+resultArr.length);
// 遍历数组,发现可以获取到“H”和“W”
for(var i = 0; i < resultArr.length; i++){
console.log("resultArr["+i+"]="+resultArr[i]);
}
忽略大小写
//目标字符串
var targetStr = 'Hello WORLD!';
//没有使用忽略大小写的正则表达式
var reg = /o/g;
//获取全部匹配
var resultArr = targetStr.match(reg);
//数组长度为1
console.log("resultArr.length="+resultArr.length);
//遍历数组,仅得到'o'
for(var i = 0; i < resultArr.length; i++){
console.log("resultArr["+i+"]="+resultArr[i]);
}
对比代码:
//目标字符串
var targetStr = 'Hello WORLD!';
//使用了忽略大小写的正则表达式
var reg = /o/gi;
//获取全部匹配
var resultArr = targetStr.match(reg);
//数组长度为2
console.log("resultArr.length="+resultArr.length);
//遍历数组,得到'o'和'O'
for(var i = 0; i < resultArr.length; i++){
console.log("resultArr["+i+"]="+resultArr[i]);
}
多行查找(m)
不使用多行查找模式,目标字符串中不管有没有换行符都会被当作一行。
//目标字符串1
var targetStr01 = 'Hello\nWorld!';
//目标字符串2
var targetStr02 = 'Hello';
//匹配以'Hello'结尾的正则表达式,没有使用多行匹配
var reg = /Hello$/;
console.log(reg.test(targetStr01));//false
console.log(reg.test(targetStr02));//true
对比代码:
//目标字符串1
var targetStr01 = 'Hello\nWorld!';
//目标字符串2
var targetStr02 = 'Hello';
//匹配以'Hello'结尾的正则表达式,使用了多行匹配
var reg = /Hello$/m;
console.log(reg.test(targetStr01));//true
console.log(reg.test(targetStr02));//true
var str = 'one two three four';
// 匹配全部空格
var reg = /\s/g;
// 将空格替换为@
var newStr = str.replace(reg,'@'); // one@two@three@four
console.log("newStr="+newStr);
var str = '今年是2014年';
// 匹配至少一个数字
var reg = /\d+/g;
str = str.replace(reg,'abcd');
console.log('str='+str); // 今年是abcd年
var str01 = 'I love Java';
var str02 = 'Java love me';
// 匹配以Java开头
var reg = /^Java/g;
console.log('reg.test(str01)='+reg.test(str01)); // flase
console.log("<br />");
console.log('reg.test(str02)='+reg.test(str02)); // true
var str01 = 'I love Java';
var str02 = 'Java love me';
// 匹配以 Java 结尾
var reg = /Java$/g;
console.log('reg.test(str01)='+reg.test(str01)); // true
console.log("<br />");
console.log('reg.test(str02)='+reg.test(str02)); // flase
var str01 = 'Hello World';
var str02 = 'I am Tom';
//匹配 abc 中的任何一个
var reg = /[abc]/g;
console.log('reg.test(str01)='+reg.test(str01));//flase
console.log('reg.test(str02)='+reg.test(str02));//true
console.log("/[a]{3}/.test('aa')="+/[a]{3}/g.test('aa')); // flase
console.log("/[a]{3}/.test('aaa')="+/[a]{3}/g.test('aaa')); // true
console.log("/[a]{3}/.test('aaaa')="+/[a]{3}/g.test('aaaa')); // true
// 目标字符串
var str01 = 'Hello World!';
var str02 = 'I love Java';
// 匹配 'World' 或 'Java'
var reg = /World|Java/g;
console.log("str01.match(reg)[0]="+str01.match(reg)[0]);//World
console.log("str02.match(reg)[0]="+str02.match(reg)[0]);//Java
6、常用正则表达式
需求 | 正则表达式 |
---|---|
数字 | -?[0-9]\\d* |
浮点数 | -?[0-9][0-9]*[.][0-9]+ |
年份 | [0-9][1-9]{3} |
月份 | ((0?[1-9]|1[012])) |
日期 | (0?[1-9][^0-9]|([12][0-9])|(3[01]?)) |
身份证号 | [1-9][0-9]{16}[a-zA-Z0-9]{1} |
电子邮箱 | \\w+@\\w+\\.[a-z]+(\\.[a-z]+)? |
Powered by Waline v2.15.5