首页 > 编程语言 >java正则匹配demo

java正则匹配demo

时间:2023-02-27 23:35:28浏览次数:61  
标签:java name 匹配 demo t2 t3 正则 Pattern group

java正则匹配实现

1. 问题描述

根据指定的字段名限制条件,提取出sql语句中的对应字段名并返回。

字段名限制条件如下:

必须以 ${ 开头,} 结尾;
中间只能包含字母、数字和下划线(_);
中间只能以字母开头;
中间长度在 3~63 个字符范围内。

比如:从小面这段sql中提取出t2_name和t3_name, 并替换成空字符串。

SELECT
  t.`t2_name` AS `t2_name`,
  t.`t3_name` AS `t3_name`
FROM
  (
    SELECT
      t2.`name` AS `t2_name`,
      t3.`name` AS `t3_name`
    FROM
      mysql130.database1.`table1` t1
      LEFT JOIN mysql130.database1.`table2` t2 ON t2.`id` = t1.`id`
      LEFT JOIN mysql130.database1.`table3` t3 ON t1.`id` = t3.`id`
  ) t
WHERE
  t.`t2_name` = '${t2_name}' and t.`t3_name` = '${t3_name}'

2. 问题思路

大体思路如下:

  1. 先写出对应的正则表达式
  2. 使用Pattern和Matcher类进行匹配,提取出对应的内容
  3. 替换掉原来的内容

1. 正则表达式

> 必须以 ${ 开头,} 结尾;            ^${ and }$
> 中间只能包含字母、数字和下划线(_); [a-zA-Z0-9_] or \w (等价)
> 中间只能以字母开头;                [a-zA-Z]
> 中间长度在 3~63 个字符范围内。       {3,63} 除去第一个为 {2,62}

最终的组合结果为:

```regex
^\$\{ + [a-zA-Z] + [a-zA-Z0-9_]{2,62} + \}$ -> ^\$\{[a-zA-Z][a-zA-Z0-9_]{2,62}\}$
```

2. 梳理java中 Pattern 和 Matcher类的关系

  • 梳理Matcher类常用方法

  • 常见报错

      1. goup()方法报错

      java.lang.IllegalStateException: No match found

      解决方法:使用find()方法进行匹配,如果匹配成功,再使用group()方法获取匹配的内容

      // 匹配成功
      if (matcher.find()) {
          // 获取匹配的内容
          String group = matcher.group();
          System.out.println(group);
      }
      

img

    1. ^ 表示匹配行的开头,$ 表示匹配行的结尾

      img

      此处为行首则可匹配成功

      img

      默认模式下,一个字符串只有一个行首和行位,中间加了\r\n也不能算是行首和行位

      img

      如果字符串中包含多行文本,需要使用多行模式(Pattern.MULTILINE)来匹配多行字符串。在多行模式下,^ 和 $ 会匹配行的开头和结尾,而不是整个字符串的开头和结尾。

      img

      img

    1. No Group 1
      img

      解决方法:使用group(0)获取匹配的内容

      弄明白group的含义:

      group 代表的是 The index of a capturing group in this matcher's pattern ,即匹配的组的索引,从1开始,0代表整个匹配的内容。

      什么时候会出现组呢?

      当正则表达式中包含括号时,就会出现组。比如:(\d{3})-(\d{3,8}),这个正则表达式中有两个组,第一个组是(\d{3}),第二个组是(\d{3,8})

      img

      有组的demo

      // 有组的情况下,group(0)是整个匹配的字符串,group(1)是第一个组匹配的字符串
      // 无组的情况下,group(0)是整个匹配的字符串,group(1)是null
      // 无组的情况下,groupCount()是0
      // 有组的情况下,groupCount()是组的个数
      String demoString3 = "010-12345";
      String pattern2 = "(\\d{3})-(\\d{3,8})";
      Pattern compiler2 = Pattern.compile(pattern2);
      Matcher matcher2 = compiler2.matcher(demoString3);
      while (matcher2.find()) {
          System.out.println(matcher2.group(0));
          System.out.println(matcher2.group(1));
          System.out.println(matcher2.group(2));
      }
      
      // 输出结果
      010-12345
      010
      12345
      
      1. 为什么中间的匹配不到呢?

      img

      因为正则指定了必须以$开始的字符串,第二个没有换行,换行后则可匹配到

      img

      去掉^限制,也可以匹配到

      img

3. 代码实现

    public static List<String> getStringFromPattern(String source, String pattern) {
        List<String> result = new ArrayList<>();

        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(source);
        while (m.find()) {
            result.add(m.group().substring(2, m.group().length() - 1));
        }

        return result;
    }

4. 总结

1. pattern 和 matcher 的关系

img

2. pattern 各类 flag 的含义

img

UNIX_LINES:unix lines模式,该模式下,仅以\n为结尾(行一般以\n或\r\n结尾);
CASE_INSENSITIVE:忽略大小写进行匹配;
COMMENTS:忽略空格字符(例如,表达式里的空格,tab,回车)和注释(从#开始,一直到行结束);
MULTILINE:多行模式的开启,在多行模式下,^匹配输入字符串开始的位置,$匹配输入字符串结尾的位置;
DOTALL:dotall模式,"."匹配所有字符,包括行终结符。(若该模式未开启,“.”表达式不匹配行终结符);
UNICODE_CASE:UNICODE_CASE模式结合CASE_INSENSITIVE模式,那么它会对Unicode字符进行大小写不敏感的匹配。(若未开启UNICODE_CASE模式,仅开始CASE_INSENSITIVE模式,则只适用于US-ASCII字符集);
CANON_EQ:当且仅当两个字符的正规分解都完全相同的情况下,则认定匹配。(默认情况下,不考虑规范相等性);

3. matcher 的常用方法

img

4. 正则表达式的常用组成部分

  • 字符类
    img
  • 预定义字符
    img
  • 数量词
    img

5. 方法参数问题,多看源码注释,解释很详细

5. tips

  1. 可使用 regexper 可视化正则表达式

  2. 可使用 regex101 测试正则表达式

6. 参考资料

Java学习笔记——正则表达式(Pattern类、Matcher类和PatternSyntaxException)

RegEX 备忘清单

标签:java,name,匹配,demo,t2,t3,正则,Pattern,group
From: https://www.cnblogs.com/livebetter/p/17162367.html

相关文章

  • javaSE学习二
    使用Scanner实现用户交互   注意点:使用next方法时一定读取到有效字符后才能结束输入,有效字符前的空白自动去除,有效字符后的空白为结束符,next不能得到有空格的字符串......
  • Java语言概述
    Java概述是SUN(StanfordUniversityNetwork,斯坦福大学网络公司)1995年推出的一门高级编程语言。是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序......
  • 从键盘输入的值 放到javabean 函数数组中
    类packagecom.fqs.demo1;publicclassCar{privateStringpinpai;privateDoubleprice;privateStringcolor;publicCar(){}......
  • Java实现简单薪水计算器相关操作代码
    /***薪水计算器*1.通过键盘输入用户的月薪,每年是几个薪水*2.输出用户年薪*3.输出一行字“如果年薪超过10万,恭喜你超越了90%的国人;如果年薪超过了20万,恭喜你超越了......
  • Java实现简单个人所得税计算器相关操作代码
    /***个税计算器*1.通过键盘输入用户的月薪*2.百度搜素个税计算方法,计算出应缴纳的税款*3.直到键盘输入88,则退出程序(使用break语句退出循环)*应纳税所得额=工资收......
  • java的基本语法-变量
    变量可以变化的量Java是一种强类型语言,,每个变量都必须声明其类型Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域注意事项每个变量都有......
  • 三天吃透Java并发八股文!
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校......
  • JavaWeb 读资源的问题-2023-2-27
    1、db.properties文件中读取username和password2、getResourceAsStream("/web-inf/classes/db.properties")3、properties.getProperty("username")publicclass......
  • C#正则表达式的完全匹配、部分匹配及忽略大小写的问题
    问题的提出根据用户给定表达式,里面含有各种数学函数,如求绝对值,三角函数,平方、开方等,分别以类似ABS(表达式),Sin(表达式),ASin(表达式),POW(表达式)等形式表述。由于用户输入......
  • C#源码匹配常用正则表达式(摘录)
    C#源码匹配:CSharpStringRegex=newRegex(@""".*?""|'.+?'",RegexOptions.Compiled);CSharpCommentRegex1=newRegex(@"//.*$",RegexOptions.Multiline|RegexOptions......