You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则表达式匹配异常求助:regex101正常Java不生效

问题解决:Java正则匹配目标行排除末尾带字母的情况

问题根源

你原正则末尾的[^a-zA-Z]存在两个核心问题:

  1. 它要求匹配一个实际存在的非字母字符,但目标行的末尾是数字后直接到行尾,没有额外字符,因此Java中find()无法找到有效匹配。
  2. 正则中的.未转义,默认匹配任意字符——虽然测试文本中是点号能匹配,但属于不严谨写法,可能导致意外匹配。

去掉[^a-zA-Z]后,正则仅匹配格式本身,不会检查后续内容,因此会错误匹配末尾带字母(如Teste)的行。

解决方案

根据你的需求,提供两种可行方案:

方案1:使用负前瞻断言(允许行内有其他内容,但格式后不能跟字母)

负前瞻断言(?!\p{L})不会消耗字符,仅检查当前位置后面不是字母,完美替代需要实际匹配字符的[^a-zA-Z]。同时修正未转义的点号:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ValidaRegExFileExemplo {

    public static void main(String[] args) {
        // 修正后的正则:转义点号,用负前瞻替代[^a-zA-Z]
        Pattern pattern = Pattern.compile("^Processo\\sNº\\s[a-zA-Z]{5,9}-\\d{7}-\\d{2}\\.\\d{4}\\.\\d{1}\\.\\d{2}\\.\\d{4}(?!\\p{L})", Pattern.CASE_INSENSITIVE);
        try {
              File myObj = new File("extrato.txt");
              Scanner myReader = new Scanner(myObj);
              while (myReader.hasNextLine()) {
                String data = myReader.nextLine();
                Matcher matcher = pattern.matcher(data);
                if (matcher.find()) {
                    System.out.println(data);
                }
              }
              myReader.close();
            } catch (FileNotFoundException e) {
              System.out.println("An error occurred.");
              e.printStackTrace();
            }
    }
}

方案2:整行匹配(仅匹配完全符合格式的行)

如果目标行仅包含你要匹配的格式内容,无其他字符,直接用$锚定行尾,配合matches()方法实现严格匹配:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ValidaRegExFileExemplo {

    public static void main(String[] args) {
        // 整行匹配正则:锚定行首行尾,确保无额外内容
        Pattern pattern = Pattern.compile("^Processo\\sNº\\s[a-zA-Z]{5,9}-\\d{7}-\\d{2}\\.\\d{4}\\.\\d{1}\\.\\d{2}\\.\\d{4}$", Pattern.CASE_INSENSITIVE);
        try {
              File myObj = new File("extrato.txt");
              Scanner myReader = new Scanner(myObj);
              while (myReader.hasNextLine()) {
                String data = myReader.nextLine();
                // 使用matches()检查整行是否完全匹配
                if (pattern.matcher(data).matches()) {
                    System.out.println(data);
                }
              }
              myReader.close();
            } catch (FileNotFoundException e) {
              System.out.println("An error occurred.");
              e.printStackTrace();
            }
    }
}

说明

  • 方案1适合行内除目标格式外还有其他合法内容,但格式后不能跟字母的场景;
  • 方案2适合行内容完全是目标格式的场景,匹配更严格。

内容的提问来源于stack exchange,提问作者ricksant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:11:24