[Java基础]正则表达式

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);
        }

    }

}

以上解法只为正则表达式练手,本题有更简单方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值