正则表达式基本使用

这篇具有很好参考价值的文章主要介绍了正则表达式基本使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 基本介绍

  • 如果要想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:
  1. 限定符
  2. 选择匹配符
  3. 分组组合和反向引用符
  4. 特殊字符
  5. 字符匹配符
  6. 定位符

2. 元字符(Metacharacter)-转义号 \

  • \\符号说明:在使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的。
  • 案例:用$去匹配“abc$(”,用(去匹配 “abc$(abc(123(
	String content = "abc$(abc(123(";
	String regStr = "\\(";
	Pattern pattern = Pattern.compile(regStr);
	Matcher matcher = pattern.matcher(content);
	while (matcher.find()) {
	    System.out.println("找到:" + matcher.group(0));
	}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • 需要用到转义符号的字符有以下:.*+()$/\?[] ^{}

3. 元字符-字符匹配符

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用
正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

匹配任意三个数字
\\d\\d\\d = \\d{3}
?表示后面是0个数字或1个数字
\\d{3}(\\d)?
相当于对 \\d 取反,表示匹配单个非数字字符
\\D = [^0-9]
+ 表示1个或多个,至少一个
\\W+\\d{2} 
String regStr = "[a-z]";//匹配 a-z 之间任意一个字符
String regStr = "[A-Z]";//匹配 A-Z 之间任意一个字符
String regStr = "abc";//匹配 abc 字符串[默认区分大小写]
String regStr = "(?i)abc";//匹配 abc 字符串[不区分大小写]

3.1 案例

  1. [a-z]表示可以匹配a-z中任意一个字符,比如[A-Z]去匹配 11A22B33C
String content = "11A22B33C";
String regStr = "[A-Z]";
Pattern pattern = Pattern.compile(regStr)
Matcher matcher = pattern.matcher(content);

while (matcher.find()) {
    System.out.println("找到:" + matcher.group(0));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  1. java正则表达式默认是区分字母大小写的,如何实现不区分大小写
(?i)abc:表示abc都不区分大小写
a(?i)bc:表示bc不区分大小写
a((?i)b)c:表示只有b不区分大小写
Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
  • 当创建 Pattern 对象时,指定 Pattern.CASE_INSENSITIVE, 表示匹配是不区分字母大小写
Pattern pattern = Pattern.compile(regStr, Pattern.CASE_INSENSITIVE);
  • [A-Z]表示可以匹配 A-Z 中任意一个字符
  • [0-9]表示可以匹配 0-9 中任意一个字符
String regStr = "abc";//匹配 abc 字符串[默认区分大小写]
String regStr = "(?i)abc";//匹配 abc 字符串[不区分大小写]
  1. [^a-z]表示可以匹配不是a-z中的任意一个字符
String content = "11A22B33CabcABC";
String regStr = "[^a-z]"; // 匹配不在 a-z 之间的任意一个字符
Pattern pattern = Pattern.compile(regStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
    System.out.println("找到:" + matcher.group(0));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

String regStr = "[^a-z]{2}"; // 匹配不在 a-z 之间的任意两个字符

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

String regStr = "[^0-9]"; // 匹配不在 0-9 之间的任意一个字符

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  1. [abcd] 表示可以匹配abcd中的任意一个字符
String content = "1A2B3CabeABE";
String regStr = "[abcd]";

//当创建 Pattern 对象时,指定 Pattern.CASE_INSENSITIVE, 表示匹配是不区分字母大小写
Pattern pattern = Pattern.compile(regStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(content);

while (matcher.find()) {
    System.out.println("找到:" + matcher.group(0));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  1. [^abcd]表示可以匹配不是abcd中的任意一个字符
  2. \\d表示可以匹配0-9的任意一个数字,相当于[0-9]
  3. \\D表示可以匹配不是0-9中的任意一个数字,相当于[^0-9]
  4. \\w匹配任意英文字符、数字和下划线,相当于[a-zA-Z0-9_]
  5. \\W相当于[^a-zA-Z0-9],是\w刚好相反
  6. \\s匹配任何空白字符(空格,制表符等)
  7. \\S 匹配任何非空白字符,和\s相反
  8. . 匹配出\n之外的所有字符,如果要匹配,本身则需要使用 \\.

4. 元字符-选择匹配符

  • 在匹配某个字符串的时候是选择性的,即:既可以匹配这个,又可以匹配那个,这时需要用到选择匹配符号
    正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用
  • 案例:
String content = "AA兮BB动CC人";
String regStr = "兮|动|人";

Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);

while (matcher.find()) {
    System.out.println("找到:" + matcher.group(0));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

5. 元字符-限定符

  • 用于指定其前面的字符和组合项连续出现多少次
    正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用
    正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用
*:表示0或n个,0到多,[0, ∞)
+:表示至少1个,1到多,[1, ∞)
?:表示至多一个,0或1,[0, 1]
{n}:表示任意长度为n的字符串
{n,}:表示组成的任意长度不小于n的字符串,[n, ∞)
{n,m}:表示组成的任意长度不小于n、不大于m的字符串,[n,m]
  • 案例:

1、n表示出现的次数,比如:a{3},1{4},\\d{2}

String context = "111111aaa";

 // 表示匹配 aaa
 String regStr = "a{3}";
 Pattern pattern = Pattern.compile(regStr);
 Matcher matcher = pattern.matcher(context);

 while (matcher.find()) {
     System.out.println("找到 " + matcher.group(0));
 }

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • 下面有 7个 1,但只能匹配到一组
String context = "1111111aaa";
// 表示匹配连续4个1
String regStr = "1{4}";

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • 有7个1,但只能匹配到3组
// 表示匹配长度为2的任意数字字符
String context = "1111111aaa";
String regStr = "\\d{2}";

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • 注意: Java匹配默认是贪婪匹配,即尽可能匹配多的
String context = "1111111aaaa33333";
// 表示匹配 aaa 或 aaaa
String regStr = "a{3,4}";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}
  • 优先匹配 4个a的情况
    正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用
  • 如:换成6个a的情况下,如果每次都匹配3个a就正好匹配到,但Java默认的是贪婪模式,尽可能的匹配多的,所以就先匹配4个a,余下2个a就不会被匹配到
String context = "1111111aaaaaa33333";

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • \\d{2,5},下面有7个1,先匹配前5个1,后面2个1也符合长度范围,都能被匹配到
String context = "1111111aaaaaa";
// 表示匹配长度为 [2,5]之间的数字字符
String regStr = "\\d{2,5}";

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • 1+:默认还是贪婪匹配,所以会一次性全部匹配到7个1
String context = "1111111aaaaaa";
String regStr = "1+";

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • \\d+:匹配一个数字或多个数字
String context = "1111111aaaaaa";
// 匹配一个数字或多个数字
String regStr = "\\d+";

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • 1*:匹配0个1或多个1
  • a1?:匹配 a 或 a1
String context = "a11111111aaaaaa";
String regStr = "a1?";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
   System.out.println("找到 " + matcher.group(0));
}
  • 还是会遵循贪心匹配原则,先匹配 a1,再匹配 a
    正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • 换成 a2? ,由于没有 a2 ,所以只能匹配到 a
    正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

6. 元字符-定位符

  • 定位符, 规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置
    正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

1、^

  • 指定起始字符
String context = "123abc";
// 以至少1个数字开头,后接任意个小写字母的字符串
String regStr = "^[0-9]+[a-z]*";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • 内容改为:String context = "123abc12";也还是可以匹配到
    正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用
  • 内容改为:String context = "123";也还是可以匹配到
    正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

2、$

  • 指定结束字符
String context = "123abc";
// 以至少1个数字开头,以至少一个小写字母结尾
String regStr = "^[0-9]+[a-z]+$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

String context = "123-a";
String regStr = "^[0-9]+\\-[a-z]+$";

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

3、\\b

  • 匹配目标字符串的边界,这里的边界是指被匹配的字符串的最后,也可以是空格的字符串后面
String context = "xdrxidongren asdfxdr qwerxdr";
// 表示匹配边界是 xdr,这里的边界是指被匹配的字符串的最后,也可以是空格的字符串后面
String regStr = "xdr\\b";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

4、\\B

  • 匹配目标字符串的非边界
String context = "xdrxidongren asdfxdr qwerxdr";
String regStr = "xdr\\B";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

7. 分组

7.1 捕获分组

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

1、非命名分组

String context = "xdrxidongren xdr1998 qwer2008xdr";
// 匹配4个数字的字符串
String regStr = "(\\d\\d)(\\d\\d)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
    System.out.println("第1个分组内容 " + matcher.group(1));
    System.out.println("第2个分组内容 " + matcher.group(2));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • 分成3组
String context = "xdrxidongren xdr1998 qwer2008xdr";
String regStr = "(\\d\\d)(\\d)(\\d)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
    System.out.println("第1个分组内容 " + matcher.group(1));
    System.out.println("第2个分组内容 " + matcher.group(2));
    System.out.println("第3个分组内容 " + matcher.group(3));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

2、命名分组

  • 即可以给分组取名
String context = "xdrxidongren xdr1998 qwer2008xdr";
// 命名分组
String regStr = "(?<group1>\\d\\d)(?<group2>\\d\\d)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
    System.out.println("第1个分组内容 " + matcher.group(1));
    System.out.println("第1个分组内容[通过组名] " + matcher.group("group1"));
    System.out.println("第2个分组内容 " + matcher.group(2));
    System.out.println("第2个分组内容[通过组名] " + matcher.group("group2"));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

7.2 非捕获分组

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

1、(?:pattern)

String context = "xdr兮动人123 yunxdr兮动人456 兮动人789qwer";
// String regStr = "兮动人123|兮动人456|兮动人789";
// 上面的写法可以等价于非捕获分组,注意:非捕获分组不能使用 matcher.group(1)
String regStr = "兮动人(?:123|456|789)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

2、(?=pattern)

  • 只匹配有选项的内容
String context = "xdr兮动人123 yunxdr兮动人456 兮动人789qwer";
// 非捕获分组不能使用 matcher.group(1)
String regStr = "兮动人(?:123|456)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

3、(?!pattern)

  • (?=pattern) 取反,匹配选项中非的情况
String context = "xdr兮动人123 yunxdr兮动人456 兮动人789qwer";
// 查出不是 兮动人123 和 兮动人456 的内容
String regStr = "兮动人(?!123|456)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}
  • 最后会匹配到 兮动人789 中的 兮动人
    正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

8. 非贪婪匹配

// 默认是贪婪匹配,会尽量匹配最多的字符串
String context = "xdr630 yunxdr";
String regStr = "\\d+";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

  • 改为非贪婪匹配(尽量匹配少的),就会一次只匹配一个数字
String regStr = "\\d+?";

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

9. 应用实例

  • 对字符串进行如下验证

1、汉字

String context = "兮动人";
// 汉字
String regStr = "^[\u0391-\uffe5]+$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
if (matcher.find()) {
    System.out.println("满足格式");
} else {
    System.out.println("不满足格式");
}

正则表达式基本使用,正则表达式,正则表达式,正则表达式基本使用

2、邮政编码,要求:1-9 开头的一个六位数,比如:352189

String context = "352189";
String regStr = "^[1-9]\\d{5}$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
if (matcher.find()) {
    System.out.println("满足格式");
} else {
    System.out.println("不满足格式");
}

3、QQ号码,要求:1-9 开头的一个(5 位数-10位数) ,如: 1123762674

String context = "1123762674";
String regStr = "^[1-9]\\d{4,9}$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
if (matcher.find()) {
    System.out.println("满足格式");
} else {
    System.out.println("不满足格式");
}

4、手机号码,要求:必须以 13,14,15,18 开头的 11 位数文章来源地址https://www.toymoban.com/news/detail-727856.html

String context = "15933567680";
String regStr = "^1[3|4|5|8]\\d{9}";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
if (matcher.find()) {
    System.out.println("满足格式");
} else {
    System.out.println("不满足格式");
}

10. 正则验证复杂URL

  • 如:匹配B站视频的url
/**
 * 思路:
 * 1.先确定url的开始部分 https:// | http://
 * 2.通过 ([\w-]+\.)+[\w-]+ 匹配 www.bilibili.com
 * 3. /video/BV1QA41187CL 匹配
 */
String content = "https://www.bilibili.com/video/BV1QA41187CL";
// 注意:[.]表示匹配的就是.本身
String regStr = "^((http|https)://)([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.]*)?$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
    System.out.println("满足格式");
} else {
    System.out.println("不满足格式");
}

到了这里,关于正则表达式基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 正则表达式使用汇总

    正则表达式是由一些具有特殊含义的字符组成的字符串,多用于查找、替换符合规则的字符串。在表单验证、Url映射等处都会经常用到。 平时可以使用正则表达式的在线测试工具练习和测试:正则表达式在线工具 我们在写用户注册表单时,只允许用户名包含字符、数字、下

    2024年02月15日
    浏览(52)
  • 【100天精通python】Day23:正则表达式,基本语法与re模块详解示例

      目录  专栏导读  1 正则表达式概述 2 正则表达式语法 2.1 正则表达式语法元素

    2024年02月14日
    浏览(54)
  • JavaScript使用正则表达式

    正则表达式(RegExp)也称规则表达式(regular expression),是非常强大的字符串操作工具,语法格式为一组特殊字符构成的匹配模式,用来匹配字符串。ECMAScript 3以Perl为基础规范JavaScript正则表达式,实现Perl 5正则表达式的子集。JavaScript通过内置RegExp类型支持正则表达式,String和Re

    2024年02月05日
    浏览(67)
  • 04 - 慎重使用正则表达式

    在讲 String 对象优化时,提到了 Split() 方法,该方法使用的正则表达式可能引起回溯问题,今天就来深入了解下,这究竟是怎么回事? 开始之前,我们先来看一个案例,可以帮助你更好地理解内容。 在一次小型项目开发中,我遇到过这样一个问题。为了宣传新品,我们开发了

    2024年02月15日
    浏览(48)
  • Swfit 使用正则表达式

    Swift 中可以通过多种方式进行正则使用和匹配。每一种情况的应用场景都不一样,可选择一种适合自己的。 Tip:使用 Raw String 定义正则表达式,可以减少使用转义符号 普通字符串正则:let pattern = “\\\\d{3,11}” 扩展分隔符正则:let pattern = #“d{3,11}”# 通过 NSpredicate 匹配正则

    2023年04月22日
    浏览(40)
  • 使用正则表达式设置强密码

    强密码需要同时含有大写字母、小写字母、数字、特殊符号。 这边先展示我自己写的。 以上代8位以上的强密码。 下面是具体解析: 正则表达式测试工具里可以自行检测写的对不对 目前较为简便的一种使用方法是搭配ApiModel和Pattern对变量进行配置。 如

    2024年02月14日
    浏览(57)
  • 使用正则表达式验证银行帐号

    银行帐号是在任何特定银行开设账户后分配给账户持有人的唯一编号。从技术上讲,我们可以将银行帐号视为主键。银行帐号使我们能够进行借记、贷记和其他交易。根据 RBI 指南,银行帐号具有独特的结构。Account Number的结构如下: 银行帐号仅以数字形式书写。 银行帐号长

    2023年04月22日
    浏览(48)
  • C#正则表达式的使用

    如果不引用则写成 System.Text.RegularExpressions.Regex 使用方法如下: 符号 含义 d 0-9的数字 D d的补集,所有非数字的字符(同[^0-9]) w 单词字符,指大小写字母、0-9数字、下划线 W w的补集 s 空白字符,包括换行符n、回车符r、制表符t、垂直制表符v、换页符f S s的补集

    2024年02月08日
    浏览(67)
  • Jmeter接口关联(三)【使用正则表达式提取值】以及正则表达式提取器中模板的含义及用法

    文章目录 前言 一、Jmeter中使用正则表达式匹配 1、选择 RegExp Tester 2、在线程组------》添加------》后置处理器-------里面添加一个“正则表达式提取器” 二、关于正则表达式提取器里面字段的解释 参数说明 三、进一步解释Jmeter正则表达式提取器中的模板 1、当模板设置为$0$ 

    2024年02月13日
    浏览(55)
  • 正则表达式 re库的使用

    模式 描述 ^ 匹配 字符串的开始 w 匹配 字母数字及下划线 W 匹配 非 字母数字及下划线 s 匹配 任意空白字符,即空格 S 匹配 任意 非空 字符 d 匹配 任意数字,等价于[0-9], d+ 表示匹配多个数字 D 匹配 任意 非 数字 A 匹配字符串开始 Z 匹配字符串结束,如果是存在换行,

    2024年02月10日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包