JAVA:正则表达式匹配

1. 非捕获组(?:)

/**
 * 根据正则表达式找到字符串中符合条件的字符段,并输出到控制台
 */
public static void match(String regex, String str) {
  Pattern pattern = Pattern.compile(regex);
  Matcher matcher = pattern.matcher(str);
  while (matcher.find()) {
      System.out.println(matcher.group());
  }
}

非捕获组会输出整个正则表达式匹配到的内容,例如:a(?:b)c,会输出匹配结果为:abc
正常使用时也可以省略?:,例如:TEST-(?:[0-9]+)可以直接写作TEST-([0-9]+)

public static void main(String[] args) throws Exception {
    //输出结果:TEST-0918
    match("^TEST-(?:[0-9]+)$", "TEST-0918"); 

    //输出结果:无
    match("^TEST-(?:[0-9]+)$", "TEST-0918-ABC");

    //输出结果:TEST-0918
    match("TEST-(?:[0-9]+)", "TEST-0918");

    //输出结果:TEST-0918
    match("TEST-([0-9]+)", "TEST-0918");

    //输出结果:TEST-0918
    match("TEST-(?:[0-9]+)", "TEST-0918-ABC");

    //输出结果(找到两组符合要求的字符串):TEST-0918、TEST-1
    match("TEST-(?:[0-9]+)", "TEST-0918-ABC-TEST-1");
}

2. 正向肯定预查(?=)

?=只会输出匹配到的符合规则的正则前面部分结果,例如:abc(?=d),匹配结果为:abc,不会输出?=d中的d

public static void main(String[] args) throws Exception {
    //输出结果:TEST-
    match("TEST-(?=[0-9]+)", "TEST-0918");
}

3. 正向否定预查(?!)

?!?=匹配规则类似,匹配结果都只是匹配的前面部分,?!表示不符合后面表达式的结果,例如:abc(?!d),表示abc后面一个字符不是d的情况。

public static void main(String[] args) throws Exception {
    //输出结果:无
    match("TEST-(?![0-9]+)", "TEST-0918");

    //输出结果:TEST-
    match("TEST-(?![0-9]+)", "TEST-ABC");
}

4. 反向肯定预查(?<=)

?<=表示反向肯定预查,匹配以某个正则开头的字符串,例如:(?<=a)bc,表示匹配以a开头的bc字符串,匹配结果:bc

public static void main(String[] args) throws Exception {
    //输出结果:-TEST
    match("(?<=[0-9]+)-TEST", "0918-TEST");

    //输出结果:无
    match("(?<=[0-9]+)-TEST", "ABC-TEST");
}

5. 反向否定预查(?<!)

?<!表示反向否定预查,匹配不以某个正则开头的字符串,例如:(?<!a)bc,表示匹配不是以a开头的bc字符串,匹配结果:bc

public static void main(String[] args) throws Exception {
    //输出结果:无
    match("(?<![0-9]+)-TEST", "0918-TEST");

    //输出结果:-TEST
    match("(?<![0-9]+)-TEST", "ABC-TEST");
}

6. 其它正则匹配示例

  • 匹配以.txt结尾的字符串:.*\\.txt
  • 匹配不以.txt结尾并且以一位数字开头的字符串:(?!.*\.txt)[0-9].*,其中(?!.*\.txt)表示不以.txt结尾,[0-9].*表示以一位数字开头。
posted @   wzlfm  阅读(291)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示