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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:45:24