Java正则表达式匹配异常求助:regex101正常Java不生效
问题解决:Java正则匹配目标行排除末尾带字母的情况
问题根源
你原正则末尾的[^a-zA-Z]存在两个核心问题:
- 它要求匹配一个实际存在的非字母字符,但目标行的末尾是数字后直接到行尾,没有额外字符,因此Java中
find()无法找到有效匹配。 - 正则中的
.未转义,默认匹配任意字符——虽然测试文本中是点号能匹配,但属于不严谨写法,可能导致意外匹配。
去掉[^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
相关产品推荐
相关产品推荐

