1. 概述
正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
2. Java正则表达式
规则 正则表达式语法
一个或多个汉字 ^[\u0391-\uFFE5]+$
邮政编码 ^[1-9]\d{5}$
QQ号码 ^[1-9]\d{4,10}$
邮箱 ^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$
用户名 (字母开头 + 数字/字母/下划线) ^[A-Za-z][A-Za-z1-9_-]+$
手机号码 ^1[3|4|5|8][0-9]\d{8}$
URL ^((http|https)://)?([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
18位身份证号 ^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$
3. 正则表达式语法
1. 创建正则表达式
x: 字符x(x可代表任何合法的字符);
\0mnn: 八进制数Omnn所表示的字符;
\xhh: 十六进制0xhh所表示的字符;
\uhhhh: 十六进制0xhhhh所表示的UNICODE字符;
\t: 制表符('\u0009');
\n: 新行(换行)符('\u000A');
\r: 回车符('\u000D');
\f: 换页符('\u000C');
\a: 报警(bell)符('\u0007');
\e: Escape符('\u001B');
\cx: x对应的控制符。例如,\cM匹配Ctrl-M。x值必须为A~Z或a~z之一;
2. 正则表达式中的特殊字符
$: 匹配一行的结尾。要匹配$字符本身,请使用\$;
^: 匹配一行的开头。要匹配^字符本身,请使用\^;
(): 标记子表达式的开始和结束位置。要匹配这些字符,请使用\(和\);
[]: 用于确定中括号表达式的开始和结束位置。要匹配这些字符,请使用\[和\];
{}: 用于标记前面子表达式的出现的频度。要匹配这些字符,请使用\{和\};
*: 指定前面子表达式可以出现零次或多次。要匹配*字符本身,请使用\*;
+: 指定前面子表达式可以出现一次或多次。要匹配+字符本身,请使用\+;
?: 指定前面子表达式可以出现零次或一次。要匹配?字符本身,请使用\?;
.: 匹配除换行符\n之外的任何单位字符。要匹配,字符本身,请使用\.;
: 用于转义下一个字符,或指定八进制、十六进制符。要匹配\字符,请使用\\;
|: 指定两项之间任选一项。要匹配|字符本身,请使用|;
3. 预定义字符
.: 可以匹配任何字符;
\d: 匹配0~9的所有数字;
\D: 匹配非数字;
\s: 匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等;
\S: 匹配所有的非空白字符;
\w: 匹配所有的单词字符,包括0~9所有的数字、26个英文字母和下划线(_);
\W: 匹配所有的非单词字符;
^: 行的开头
4. 边界匹配符
$: 行的结尾
\b: 单词的边界
\B: 非单词的边界
\A: 输入的开头
\G: 前一个匹配的结尾
\Z: 输入的结尾,仅用于最后的结束符
\z: 输入的结尾
5. 出现次数
*: 0次或多次
+: 一次或多次
?: 0次或一次
{n}: 出现n次
{n,}: 至少出现n次
{n,m}: 出现n到m次
4. 用例
1.匹配验证-验证Email是否正确
public static void main(String[] args) {
// 要验证的字符串
String str = "service@xsoftlab.net";
// 邮箱验证规则
String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}";
// 编译正则表达式
Pattern pattern = Pattern.compile(regEx);
// 忽略大小写的写法
// Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
// 字符串是否与正则表达式相匹配
boolean rs = matcher.matches();
System.out.println(rs);
}
2. 在字符串中查询字符或者字符串
public static void main(String[] args) {
// 要验证的字符串
String str = "baike.xsoftlab.net";
// 正则表达式规则
String regEx = "baike.*";
// 编译正则表达式
Pattern pattern = Pattern.compile(regEx);
// 忽略大小写的写法
// Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
// 查找字符串中是否有匹配正则表达式的字符/字符串
boolean rs = matcher.find();
System.out.println(rs);
}
3. 求表达式的值
2017网易春招笔试题:
import java.util.Scanner;
public class Biaodashi {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()) {
String s = sc.nextLine();
String[] num = s.split("[^0-9]");
String[] fuhao = s.split("\\d");
int sum = Integer.parseInt(num[0]);
//System.out.println(sum);
for(int i = 0, j = 0; i < num.length - 1 && j < fuhao.length;) {
int n1 = Integer.parseInt(num[++i]);
//System.out.println("num[i]" + n1);
String f = fuhao[++j];
//System.out.println("f" + f);
if("+".equals(f)) sum += n1;
else if("-".equals(f)) sum -= n1;
else if("*".equals(f)) sum *= n1;
}
System.out.println(sum);
}
}
}
以上解法只为正则表达式练手,本题有更简单方法。