正则表达式
正则表达式的作用是规定一个字符串的格式,正则表达式使用一些特殊的字符组合来描述格式。
正则表达式 | 说明 |
---|---|
[abc] | a、b、c中任意一个字符 |
[^abc] | 除了a、b、c的任意字符 |
[a-z] | a、b、c、......、z中任意一个字符 |
[a-zA-Z0-9] | az、AZ、0~9中任意一个字符 |
[a-z&&[^bc]] | a~z中除了b和c以外的任意一个字符,其中&&表示“与”的关系 |
. | 任意一个字符 |
\d | 任意一个数字字符,相对于[0-9] |
\D | 任意一个非数字字符,相对于[^0-9] |
\s | 空白字符,相对于[\t\n\x0B\f\r] |
\S | 非空白字符,相对于[^\s] |
\w | 任意一个单词字符,相对于[a-zA-Z_0-9] |
\W | 任意一个非单词字符,相对于[^\w] |
X? | 表示0个或1个X |
X* | 表示0个或任意多个X |
X+ | 表示0个到任意多个X(大于等于1个X) |
X{n} | 表示n个X |
X{n,} | 表示n到任意多个个X(大于等于n个X) |
X{n,m} | 表示n到m个X(大于等于n个且小于m个X) |
- 正则表达式中:
[]:描述一个字符[a-z]:是小写字母
():将一组字符看为一个整体
|:描述或关系
+:表示前面的内容出现1到多次
*:表示前面的内容出现0到多次
?:表示前面的内容出现0到1次 - 正则表达式的首尾
^:表示字符串必须以其后面约束的内容开始
$:表示字符串必须以其前面约束的内容结尾
若正则表达式不书写^或者$,正则表达式代表匹配部分内容,都加上则表示全匹配。 - +的作用代表前面描述的内容出现1次以上等同于{1,}
- 实际中在正则表达式中有特殊含义的字符要用\转义,如下面的"."需要用"\."来表示
eg:描述邮箱格式(123ab_AB@qq.com):[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\.com|\.cn|\.net) - String的split方法是根据给定[正则表达式]的匹配拆分此字符串,所以对于正则表达式中有特殊含义的字符要用\转义。如String.split("\\.");
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 正则表达式
*/
public class Regex {
public static void main(String[] args){
/**
* Pattern的作用是描述正则表达式的格式支持
* 使用静态方法compile注册正则表达式生成实例
*/
/**
* 使用java的字符串去描述正则表达式的时候,会出现一个冲突
* 如何描述正则表达式的"."。
*起因:
* 在正则表达式中我们想描述一个".",但"."在正则表达式中有特殊的含义,
* 它代表任意字符,所以我们在正则表达式中想描述"."的愿意要写成"\."。
* 但是我们用java的字符串去描述正则表达式的时候,因为"."在java字符串
* 中没有特殊的含义,所以java认为我们书写String s = "\.";是有语法错误的,
* 因为"."不需要转义。这就产生了冲突。
*目的:
* 我们实际的目的很简单,就是要让java的字符串描述"\."
* 所以,那么在java中"\"是有特殊含义的,代表转义字符
* 我们只需要将"\"转义为单纯的斜杠"\\"即可描述"\."了。
* 所以我们用java描述"\."的正确写法是String s = "\\.";
*/
//定义邮箱正则表达式
String regMailStr = "^[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.com|\\.cn|\\.net)+$";
//定义手机号码正则表达式
String regPhoneStr = "^(\\+86)?\\d{11}$";
//注册正则表达式
Pattern pattern = Pattern.compile(regMailStr);
String mailStr="@abc_defghi123@yahoo.com.cn";
//匹配字符串,返回描述匹配结果的Matcher实例
Matcher matcher = pattern.matcher(mailStr);
//通过调用Matcher的find方法得知是否匹配成功
if (matcher.find()){
System.out.println("邮箱格式正确");
}else {
System.out.println("邮箱格式错误");//邮箱格式错误
}
}
}
实例
String numRule = "[1][3578]\\d{9}";//"[1]"代表第1位为数字1,"[3578]"代表第二位可以为3、5、7、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。
String phone = "13879668668";
if (phone.matches(numRule)) { //告知此字符串是否匹配给定的正则表达式
System.out.println("手机号码符合要求");//手机号码符合要求
} else {
System.out.println("手机号码不符合要求");
}
//下面正则的含义:必须以http://或https://开头,中间[a-zA-Z0-9.]出现一到多次,之后再拼接:
//最后以0~9的数字出现0到多次结尾
String rule = "^(http://|https://)[a-zA-Z0-9.]+:\\d*$";
//注册正则表达式
Pattern pattern = Pattern.compile(rule);
//匹配字符串,返回描述匹配结果的Matcher实例
Matcher matcher = pattern.matcher("http://www.baidu.com:");
//通过调用Matcher的find方法得知是否匹配成功
if (matcher.find()) {
System.out.println("域名符合要求");//域名符合要求
}else{
System.out.println("域名不符合要求");
}
工具类
import android.text.TextUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexUtil {
/**
* 验证手机号是否为正确手机号
*
* @param mobile 手机号
* @return
*/
public static boolean isMobilePhoneNumber(String mobile) {
if (TextUtils.isEmpty(mobile)) {
return false;
}
//Pattern p = Pattern.compile("^[1][3,4,5,7,8,9][0-9]{9}$");
Pattern p = Pattern
.compile("^(13[0-9]|15[012356789]|166|19[89]|17[3678]|18[0-9]|14[57])[0-9]{8}$");
Matcher m = p.matcher(mobile);
m.find();
return m.matches();
}
/**
* 身份证是否合法
*
* @return
*/
public static boolean isIdCard(String idCard) {
boolean result = false;
if (!TextUtils.isEmpty(idCard)) {
String IDCardRegex = "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x|Y|y)$)";
result = idCard.matches(IDCardRegex);
}
return result;
}
/**
* 检测邮箱地址是否合法
*
* @param email
* @return true合法 false不合法
*/
public static boolean isEmail(String email) {
boolean flag = false;
try {
String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
Pattern regex = Pattern.compile(check);
Matcher matcher = regex.matcher(email);
flag = matcher.matches();
} catch (Exception e) {
flag = false;
}
return flag;
}
/**
* 纳税人识别号是否合法
*
* @param payNumber
* @return
*/
public static boolean isPayNumer(String payNumber) {
if (TextUtils.isEmpty(payNumber)) {
return false;
}
Pattern p = Pattern
.compile("(^[A-Za-z0-9]{15}$)|(^[A-Za-z0-9]{18}$)|^[A-Za-z0-9]{20}$");
Matcher m = p.matcher(payNumber);
return m.matches();
}
}
网友评论