正则表达式

正则表达式

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|cdab或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, Pattern.CASE_INSENSITIVE);  // 后一个参数表明不区分大小写
        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) {

        // 匹配a-z之间的任意一个字符
        // [a, c, x, x]
        System.out.println(match("a11c8Wxx", "[a-z]"));
        // 匹配不是a-z之间的任意一个字符
        // [&, %, 4, ?, /, \]
        System.out.println(match("ad&%md4?y/fd\\", "[^a-z]"));

        // 匹配0-9之间的任意一个字符
        // [1, 1, 8]
        System.out.println(match("a11c8Wxx", "[0-9]"));
        System.out.println(match("a11c8Wxx", "\\d"));
        // 匹配不是0-9之间的任意一个字符
        // [a, c, W, x, x]
        System.out.println(match("a11c8Wxx", "[^0-9]"));
        System.out.println(match("a11c8Wxx", "\\D"));

        // 匹配 abc, 默认区分大小写
        // [abc]
        System.out.println(match("a11c8abc35ABC", "abc"));

        // 匹配 abc, 不区分大小写
        // [abc, ABC]
        System.out.println(match("a11c8abc35ABC", "(?i)abc"));

        // 匹配 abc, 只有b不区分大小写
        // [abc, aBc]
        System.out.println(match("abc3ABC56aBc", "a((?i)b)c"));

        // 匹配不是a-z之间的连续的两个字符
        // [&%, 4?]
        System.out.println(match("ad&%md4?y/fd\\", "[^a-z]{2}"));

        // 匹配aeiou中的任意一个字符
        // [e, o, o]
        System.out.println(match("hello world ", "[aeiou]"));

        // 匹配 任意英文字符、数字和下划线,相当于[a-zA-Z0-9_]
        // [a, d, m, d, 4, y, f, d, _, D, f]
        System.out.println(match("ad&%md4?y/fd\\_Df", "[a-zA-Z0-9_]"));
        System.out.println(match("ad&%md4?y/fd\\_Df", "\\w"));
        // 匹配 任意的非英文字符、数字和下划线,相当于[^a-zA-Z0-9_]
        // [&, %, ?, /, \]
        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"));

        // 匹配任意非空白字符。
        // [i, l, o, v, e, y, o, u, !, y, o, u, ?]
        System.out.println(match("i love\tyou! you?\n", "\\S"));

        // 匹配除了换行之外所有的字符
        // [i,  , l, o, v, e, 	, y, o, u, !,  , y, o, u, ?]
        System.out.println(match("i love\tyou! you?\n", "."));


        System.out.println("---------------------选择匹配符----------------------");
        // 匹配 i 或者 you
        // [i, you, you]
        System.out.println(match("i love\tyou! you?\n", "i|you"));


        System.out.println("---------------------限定符----------------------");
        // 匹配以c开头,且其后仅包含任意个ab的字符串(可以为0个)    贪婪匹配
        // [cab, cababab]
        System.out.println(match("ababcab521cababab", "c(ab)*"));

        // 匹配仅包含任意个ab的字符串(至少1个)    贪婪匹配
        // [abab, ab, ababab]
        System.out.println(match("ababcab521ababab", "(ab)+"));

        // 匹配abab或者ababab    默认贪婪匹配, 尽可能匹配多的
        // [abab, ababab]
        System.out.println(match("ababcab521ababab", "(ab){2,3}"));

        // 匹配2~5个数字    默认贪婪匹配, 尽可能匹配多的
        // [13145, 21]
        System.out.println(match("1314521", "\\d{2,5}"));

        // 匹配数字    默认贪婪匹配, 尽可能匹配多的
        // [1314, 521]
        System.out.println(match("1314 i love you 521", "\\d+"));

        // 匹配以a开头,且其后有0个或1个数字    默认贪婪匹配, 尽可能匹配多的
        // [a1, a4, a]
        System.out.println(match("a1314 i love you a4 alone", "a\\d?"));


        System.out.println("---------------------定位符----------------------");
        // 匹配以至少一个数字开头,后接任意个小写字母的字符串    默认贪婪匹配, 尽可能匹配多的
        // [123you]
        System.out.println(match("123you? 1314love/you", "^[0-9]+[a-z]*"));

        // 以1个数字开头后接-, 并以至少一个小写字母结尾的字符串    默认贪婪匹配, 尽可能匹配多的
        // [1-abc]
        System.out.println(match("1-abc", "^[0-9]\\-[a-z]+$"));


        System.out.println("---------------------一些应用----------------------");
        // 验证整个字符串是否是全部由汉字组成
        System.out.println(find("我爱你!中国!", "^[\u0391-\uffe5]+$"));  // true
        System.out.println(find("我爱你 中国", "^[\u0391-\uffe5]+$"));  // false

        // 验证是否是邮政编码: 以1-9开头的六位数
        System.out.println(find("100000", "^[1-9]\\d{5}$"));  // true
        System.out.println(find("1a2345", "^[1-9]\\d{5}$"));  // false

        // 验证是否是QQ号: 以1-9开头的一个5~10位数
        System.out.println(find("11372479", "^[1-9]\\d{4,9}$"));  // true
        System.out.println(find("123", "^[1-9]\\d{4,9}$"));  // false

        // 验证是否是有个满足如下要求的手机号: 以13、14、15、18开头的一个11位数
        System.out.println(find("13912345678", "^1[3|4|5|8]\\d{9}$"));  // true
        System.out.println(find("139123456789", "^1[3|4|5|8]\\d{9}$"));  // false

        // 匹配URL
        // 注意:写在[]中的.或者+或者*或者?就是字面意思,不需要转义,[]外的需要
        String url = "https://blog.csdn.net/weixin_42638946?type=blog";
        String urlReg = "^((http|https)://)([\\w-]+\\.)+[\\w-]+(/[\\w-?=&/%.#]*)?$";
        System.out.println(find(url, urlReg));  // true

        // 匹配邮箱
        // 如下是 String 中的API, 是整体匹配, 此时可以不加首尾限定符(相当于加了)
        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));  // true
        System.out.println(email2.matches(emailReg));  // true

        // 寻找字符串中的邮箱
        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));  // [i-love-521@163.com, 11372@qq.com]

        // 验证数字是否是整数或者小数
        String numReg = "^[-+]?(([1-9]\\d*)|0)(\\.\\d+)?$";
        System.out.println("123".matches(numReg));  // true
        System.out.println("0.01".matches(numReg));  // true
        System.out.println("-1.03".matches(numReg));  // true
        System.out.println("+0.00".matches(numReg));  // true
        System.out.println("0012.34".matches(numReg));  // false

        // 分组匹配
        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("匹配失败!");
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值