正则表达式
1 正则表达式语法
注意:以下例子都是针对Java语言的
符号 | 含义 | 示例 | 解释 | 匹配输入 |
---|
[] | 可接受的字符列表 | [efgh] | e、f、g、h中的任意1个字符 | |
[^] | 不可接受的字符列表 | [^abc] | 除a、b、c之外的任意1个字符,包括数字和特殊符号 | |
- | 连字符 | A-Z | 任意大写字母 | |
. | 匹配除了 \n 以外的任意字符 | a…b | 以a开头,b结尾,中间包括2个任意字符的长度为4的字符串 | aaab、a3*b |
\\d | 匹配单个数字字符,相当于[0-9] | \\d{3}(\\d)? | 包含3个或者4个数字的字符串 | 123、9876 |
\\D | 匹配单个非数字字符,相当于[^0-9] | \\D(\\d)* | 以任意单个非数字开头,后接任意个数数字字符 | a、A342 |
\\w | 匹配单个数字、大小写字母字符,相当于[0-9a-zA-Z] | \\d{3}\\w{4} | 以3个数字字符开头的长度为7的数字字母字符串 | 234abcd、1234Pe |
\\W | 匹配单个非数字、大小写字母字符,相当于[^0-9a-zA-Z] | \\W+\\d{2} | 以至少1个非数字字母字符开头,2个数字字符结尾的字符串 | #29、#?@10 |
\\f | 换页符匹配 | | | |
\\n | 换行符匹配 | | | |
\\r | 匹配一个回车字符 | | | |
\\t | 制表符匹配 | | | |
\\v | 垂直制表符匹配 | | | |
\\s | 匹配任意空白字符,包括空格、制表符、换页符等。和[\\f\\n\\r\\t\\v] 等价 | | | |
\\S | 匹配任意非空白字符。和[^\\f\\n\\r\\t\\v] 等价 | | | |
符号 | 含义 | 示例 | 解释 |
---|
| | 匹配"|"之前或之后的表达式 | ab|cd | ab或cd |
符号 | 含义 | 示例 | 说明 | 匹配输入 |
---|
* | 指定字符重复0次或n次(无要求) | (abc)* | 进包含人一个abc的字符串 | abc、abcabcabc |
+ | 指定字符重复1次或n次(至少1次) | m+(abc)* | 以至少1个m开头,后接人一个abc的字符串 | m、mabc、mabcabc |
? | 指定字符重复0次或1次(最多1次) | m+abc? | 以至少1个m开头,后接ab或abc的字符串 | mab、mabc、mmmab |
{n} | 只能输入n各字符 | [abcd]{3} | 由abcd中字母组成的任意长度为3的字符串 | abc、adc、adc |
{n,} | 指定至少n个匹配 | [abcd]{3,} | 由abcd中的字母组成的任意长度不小于3的字符串 | aab、aaabdc |
{n, m} | 指定至少n个但不多于m个匹配 | [abcd]{3,5} | 由abcd中的字母组成的任意长度不小于3,不大于5的字符串 | abc、aaaaa、bcdab |
符号 | 含义 | 示例 | 说明 | 匹配输入 |
---|
^ | 指定起始字符 | ^[0-9]+[a-z]* | 以至少1个数字开头,后接人一个小写字母的字符串 | 123、6aa、555def |
$ | 指定结束字符 | ^[0-9]\\+[a-z]+ | 以1个数字开头后接连字符"-",并以至少1个小写字母结尾的字符串 | 1-a、2-dcv |
\\b | 匹配目标字符串的边界 | han\\b | 这里说的字符串的边界指的是字符串间有空格,或者是目标字符串的结束位置 | hantthan nnhan |
\\B | 匹配目标字符串的非边界 | han\\B | 和\\b 的含义刚好相反 | hantthan nnhan |
常用分组构造形式 | 说明 |
---|
(pattern) | 非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由转为哪个根正则表达式模式匹配的文本,其他捕获结果则是根据左括号的顺序从1开始自动编号 |
(?<name>pattern) | 命名捕获。将匹配的字符串捕获到一个组名称或者编号名称中。用于name的字符串不能包含任何标点字符,并且不能以数字开头。可以使用单引号替代尖括号,例如(?'name') |
常用分组构造形式 | 说明 |
---|
(?:pattern) | 匹配pattern但不捕获该子匹配的子表达式,即它是一个飞不火匹配,不存储以后使用的匹配。这对于用"or"字符(|)组合模式部件的情况很有用。例如,industry|industries 可以使用industr(?:y|ies) |
(?=pattern) | 它是一个非捕获匹配。例如Windows (?=95|98|NT|2000) 可以匹配Windows 2000 中的Windows ,但不匹配Windows 3.1 中的Windows 。 |
(?!pattern) | 该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串,它是一个非捕获匹配。例如上例中,Windows 3.1 中的Windows 可以被匹配,但是Windows 2000 中的Windows 不能被匹配。 |
2 使用案例
package com.wxx;
import java.util.*;
public class Main {
public static List<String> match(String context, String regStr) {
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
List<String> res = new ArrayList<>();
while (matcher.find()) res.add(matcher.group(0));
return res;
}
public static boolean find(String context, String regStr) {
return Pattern.compile(regStr).matcher(context).find();
}
public static void main(String[] args) {
System.out.println(match("a11c8Wxx", "[a-z]"));
System.out.println(match("ad&%md4?y/fd\\", "[^a-z]"));
System.out.println(match("a11c8Wxx", "[0-9]"));
System.out.println(match("a11c8Wxx", "\\d"));
System.out.println(match("a11c8Wxx", "[^0-9]"));
System.out.println(match("a11c8Wxx", "\\D"));
System.out.println(match("a11c8abc35ABC", "abc"));
System.out.println(match("a11c8abc35ABC", "(?i)abc"));
System.out.println(match("abc3ABC56aBc", "a((?i)b)c"));
System.out.println(match("ad&%md4?y/fd\\", "[^a-z]{2}"));
System.out.println(match("hello world ", "[aeiou]"));
System.out.println(match("ad&%md4?y/fd\\_Df", "[a-zA-Z0-9_]"));
System.out.println(match("ad&%md4?y/fd\\_Df", "\\w"));
System.out.println(match("ad&%md4?y/fd\\_Df", "[^a-zA-Z0-9_]"));
System.out.println(match("ad&%md4?y/fd\\_Df", "\\W"));
System.out.println(match("i love\tyou!", "\\s"));
System.out.println(match("i love\tyou! you?\n", "\\S"));
System.out.println(match("i love\tyou! you?\n", "."));
System.out.println("---------------------选择匹配符----------------------");
System.out.println(match("i love\tyou! you?\n", "i|you"));
System.out.println("---------------------限定符----------------------");
System.out.println(match("ababcab521cababab", "c(ab)*"));
System.out.println(match("ababcab521ababab", "(ab)+"));
System.out.println(match("ababcab521ababab", "(ab){2,3}"));
System.out.println(match("1314521", "\\d{2,5}"));
System.out.println(match("1314 i love you 521", "\\d+"));
System.out.println(match("a1314 i love you a4 alone", "a\\d?"));
System.out.println("---------------------定位符----------------------");
System.out.println(match("123you? 1314love/you", "^[0-9]+[a-z]*"));
System.out.println(match("1-abc", "^[0-9]\\-[a-z]+$"));
System.out.println("---------------------一些应用----------------------");
System.out.println(find("我爱你!中国!", "^[\u0391-\uffe5]+$"));
System.out.println(find("我爱你 中国", "^[\u0391-\uffe5]+$"));
System.out.println(find("100000", "^[1-9]\\d{5}$"));
System.out.println(find("1a2345", "^[1-9]\\d{5}$"));
System.out.println(find("11372479", "^[1-9]\\d{4,9}$"));
System.out.println(find("123", "^[1-9]\\d{4,9}$"));
System.out.println(find("13912345678", "^1[3|4|5|8]\\d{9}$"));
System.out.println(find("139123456789", "^1[3|4|5|8]\\d{9}$"));
String url = "https://blog.csdn.net/weixin_42638946?type=blog";
String urlReg = "^((http|https)://)([\\w-]+\\.)+[\\w-]+(/[\\w-?=&/%.#]*)?$";
System.out.println(find(url, urlReg));
String email = "i-love-521@163.com";
String email2 = "11372@qq.com";
String emailReg = "^([\\w-]+)@([a-zA-Z0-9]+\\.)+[a-zA-Z]+$";
System.out.println(email.matches(emailReg));
System.out.println(email2.matches(emailReg));
String emails = "i love you i-love-521@163.com, and you? 11372@qq.com love?";
String emailReg1 = "([\\w-]+)@([a-zA-Z0-9]+\\.)+[a-zA-Z]+";
System.out.println(match(emails, emailReg1));
String numReg = "^[-+]?(([1-9]\\d*)|0)(\\.\\d+)?$";
System.out.println("123".matches(numReg));
System.out.println("0.01".matches(numReg));
System.out.println("-1.03".matches(numReg));
System.out.println("+0.00".matches(numReg));
System.out.println("0012.34".matches(numReg));
String url2 = "https://www.baidu.com:80/index.html";
String urlReg2 = "^([a-zA-Z]+)://([a-zA-Z.]+):(\\d+)[\\w/]*/([\\w.]+)$";
Matcher matcher = Pattern.compile(urlReg2).matcher(url2);
if (matcher.matches()) {
System.out.println("整体匹配:" + matcher.group(0));
System.out.println("协议:" + matcher.group(1));
System.out.println("域名:" + matcher.group(2));
System.out.println("端口:" + matcher.group(3));
System.out.println("文件:" + matcher.group(4));
} else {
System.out.println("匹配失败!");
}
}
}