为何此处会抛出IllegalStateException异常(提示信息"No match found")?
解决IllegalStateException: No match found的问题
问题根源
你遇到的异常是因为两个关键问题:
- 正则表达式错误:你写的
[;\n$]里,$在字符类中是普通字符,不是表示字符串/行尾的断言。也就是说这个正则只会匹配后面跟着;、\n或者$符号的内容,而最后一个元素E1后面没有这些字符,导致第三次m.find()返回false,此时调用m.group()就会抛出异常。 - 未检查
find()的返回值:你连续调用三次m.find(),但没有判断每次调用是否成功匹配。一旦某次find()失败,后续的group()调用必然报错。
另外,你的代码逻辑是想解析每行的三个字段,但当前的正则会把表头和数据混在一起处理,这可能也不符合你的预期。
解决方案1:修正正则并完善Matcher调用
我们把正则改成匹配字段内容,允许字段结尾是;、\n或者字符串结束(用非捕获组(?:;|\n|$)代替字符类),同时每次调用find()后都检查是否匹配成功:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Solution { public static void main(String[] args) { convert1("Login;Name;Email\nL1;N1;E1"); } public static void convert1(String input) { // 修正正则:匹配字段内容,后面跟着;、换行或字符串结尾 Pattern p = Pattern.compile(".+?(?=;|\n|$)"); Matcher m = p.matcher(input); // 跳过表头的三个字段 for (int i = 0; i < 3 && m.find(); i++) {} // 处理数据行的三个字段 while (m.find()) { String login = m.group(); if (!m.find()) break; String name = m.group(); if (!m.find()) break; String email = m.group(); System.out.printf("Login: %s, Name: %s, Email: %s%n", login, name, email); } } }
这里用了正向预查(?=;|\n|$),这样匹配的内容不会包含后面的分隔符,也就不需要再用substring去掉最后一个字符了。另外先跳过表头的三个字段,再处理数据。
解决方案2:更简单的字符串拆分(推荐)
其实处理这种CSV格式的字符串,用split拆分比正则Matcher更直观、更不容易出错:
public class Solution { public static void main(String[] args) { convert1("Login;Name;Email\nL1;N1;E1"); } public static void convert1(String input) { // 按换行拆分每行 String[] lines = input.split("\n"); // 跳过表头行,从第二行开始处理 for (int i = 1; i < lines.length; i++) { // 按分号拆分每行的字段 String[] fields = lines[i].split(";"); if (fields.length >= 3) { String login = fields[0]; String name = fields[1]; String email = fields[2]; System.out.printf("Login: %s, Name: %s, Email: %s%n", login, name, email); } } } }
这种方法代码更简洁,逻辑清晰,也避免了正则相关的陷阱。
内容的提问来源于stack exchange,提问作者Denys_newbie
相关产品推荐
相关产品推荐

