Java正则表达式如何定位不匹配字符的所在列号?
解决方法
你的需求是找到第一个不符合正则规则的字符的位置(从1开始计数),可以通过两种方式实现:
方法一:利用Matcher查找不匹配的子串
修改正则为匹配单个允许的字符,通过匹配位置的间隙定位第一个不匹配的字符:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { Pattern p = Pattern.compile("[a-zA-Z0-9$&+,:;=\\[\\]{}?@#|\\\\'<>._^*()%!/~\"` -]"); String input = "f698fec0-dd89-11e8-b06b-☺"; Matcher matcher = p.matcher(input); int invalidPos = -1; int currentIndex = 0; while (matcher.find()) { if (matcher.start() != currentIndex) { // 找到第一个不匹配的位置,转为1-based列号 invalidPos = currentIndex + 1; break; } currentIndex = matcher.end(); } // 处理末尾剩余的不匹配字符 if (invalidPos == -1 && currentIndex < input.length()) { invalidPos = currentIndex + 1; } if (invalidPos != -1) { System.out.println("第一个不匹配的字符在第" + invalidPos + "列"); } else { System.out.println("所有字符都符合规则"); } } }
方法二:逐个字符检查(更直观)
直接遍历字符串的每个字符,验证是否符合规则:
import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String allowedPattern = "^[a-zA-Z0-9$&+,:;=\\[\\]{}?@#|\\\\'<>._^*()%!/~\"` -]*$"; String input = "f698fec0-dd89-11e8-b06b-☺"; int invalidPos = -1; for (int i = 0; i < input.length(); i++) { char c = input.charAt(i); if (!Pattern.matches(allowedPattern, String.valueOf(c))) { invalidPos = i + 1; // 转为1-based列号 break; } } if (invalidPos != -1) { System.out.println("第一个不匹配的字符在第" + invalidPos + "列"); } else { System.out.println("所有字符都符合规则"); } } }
两种方法都会输出:第一个不匹配的字符在第25列,符合预期。
说明
- 列号采用从1开始计数的规则,所以需要将0-based索引加1转换。
- 方法一适合处理复杂正则的连续匹配场景,方法二更适合简单字符校验的直观实现。
内容的提问来源于stack exchange,提问作者Panadol Chong
相关产品推荐
相关产品推荐

