概述:
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。【百度百科】
正则常用符号
预定义字符
符号 | 说明 |
---|
. | 任何字符(与结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字:[^0-9] |
\s | 空白字符:[\t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9]匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的”单词”字符使用Unicode字符 |
\W | 非单词字符:[^\w] |
\转义字符 | “\”匹配”\” |
量词
符号 | 说明 |
---|
* | 等价于{0,} 匹配前面子表达式0次或多次,如fuck* 能匹配fuc fuck fuckk fuckkkk。 |
+ | 等价于{1,} 匹配前面子表达式一次或多次,如8+ 匹配8,88,888。 |
? | 等价于{0,1} 匹配前面子表达式零次或一次。 |
{n} | 匹配确定的n次。如a{2}不能匹配and中的a,但是能匹配aand中的两个aa。 |
{n,} | 至少匹配n次。如e{2,}不能匹配bed中的e,但是能匹配seeeed中的所有e。 |
{n,m} | 最少匹配n次,且最多匹配m次。如e{1,3},将匹配seeeeed中的前三个e。 |
量词后缀
符号 | 说明 |
---|
? | 在量词后面加?,表示将正则默认的贪婪匹配改为勉强模式。 |
+ | 在量词后边加+,表示将正则默认的贪婪模式改为侵占模式。 |
说明:
边界匹配字符
符号 | 说明 |
---|
^ | 行的开头。 |
$ | 行的结尾。 |
\b | 单词的边界。 |
\B | 非单词的边界。 |
逻辑字符
符号 | 说明 |
---|
与 | 如:abc 表示只有同时出现a、b、c三个字符才能匹配。 |
|或 | 如:f(oo|ee)t 表示匹配foot或feet。 |
^非 | 表示逻辑反的意思,如:^a表示匹配非a的字符。 |
其它常见字符
[] | 使用说明 |
---|
[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) | 一组匹配数字。 |
(\d{4})-(\d{2}-(\d\d)) | 输入内容2018-03-07,第一组完全匹配2018-03-07,第二组匹配(\d{4}匹配2018),第三组((\d{2}-(\d\d))匹配03-07,第四组(\d\d)匹配07 |
正则例子
正则匹配:
public static void main(String[] args) {
/**
* 正则表达式:验证汉字
*/
final String REGEX_CHINESE = "^[\u4e00-\u9fa5]+$";
/**
* 正则表达式:验证QQ
*/
final String REGEX_QQ = "\\d{5,15}";
/**
* 正则表达式:验证用户名
*/
final String REGEX_USERNAME = "^[a-zA-Z]\\w{3,20}$";
/**
* 正则表达式:验证密码
*/
final String REGEX_PASSWORD = "^[a-zA-Z0-9]{6,16}$";
/**
* 正则表达式:验证邮箱
*/
final String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
String qq = "553045444";
boolean qFlag = qq.matches(REGEX_QQ);
if (qFlag) {
System.out.println(qq + "是qq号码");
} else {
System.out.println(qq + "不是qq号码");
}
String chinese = "张好";
boolean cFlag = chinese.matches(REGEX_CHINESE);
if (cFlag) {
System.out.println(chinese + "合法");
} else {
System.out.println(chinese + "不合法");
}
String user = "z_ni_0hao";
boolean uFlag = user.matches(REGEX_USERNAME);
if (uFlag) {
System.out.println(user + "合法");
} else {
System.out.println(user + "不合法");
}
String pass = "aaaa432";
boolean pFlag = pass.matches(REGEX_PASSWORD);
if (pFlag) {
System.out.println(pass + "合法");
} else {
System.out.println(pass + "不合法");
}
}
正则查找、分割、替换:
public static void main(String[] args) {
String text ="This is the text which is to be searched " +"for occurrences of the word 'is'.";
String patternString = "is";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
int count = 0;
while(matcher.find()) {
count++;
System.out.println("found: " + count + " : " + matcher.start() + " - " + matcher.end());
}
String groupRegex = "(\\d{4})-(\\d{2}-(\\d{2}))";
String groupContent = "2018-03-07";
Pattern gPattern = Pattern.compile(groupRegex);
Matcher gMatcher =gPattern.matcher(groupContent);
while(gMatcher.find()){
int counts = gMatcher.groupCount();
for(int i =0;i<=counts;i++){
System.out.println(gMatcher.group(i));
}
}
String content = "ni1234ni12ni4354235ni33";
String regex = "\\d{4}";
String []splitContent = content.split(regex);
for(String splits : splitContent){
System.out.println(splits);
}
String repleace = content.replaceAll(regex, "#");
System.out.println(repleace);
}
希望對你有所幫助!