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

如何在Java Scanner中用正则区分单/双分号作为不同分隔符?

解决方案

核心正则表达式

正确的正则需要优先匹配连续两个的分号/冒号,再匹配单个的分号/冒号,同时通过捕获组获取实际匹配的分隔符,正则如下:

((?:;;|::)|(?:;|:))

正则说明

  • (?:;;|::):非捕获组,优先匹配连续两个相同的分隔符(;;或::),避免被拆成单个分隔符处理
  • (?:;|:):非捕获组,匹配单个的分号或冒号
  • 外层(...)捕获组:保存实际匹配到的分隔符,后续可通过长度判断是单分隔符(长度1)还是双分隔符(长度2)

完整代码实现

import java.util.Scanner;
import java.util.regex.MatchResult;

public class StringProcessor {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 设置分隔符正则:先匹配双分隔符,再匹配单分隔符
        scanner.useDelimiter("((?:;;|::)|(?:;|:))");
        
        StringBuilder result = new StringBuilder();
        
        while (scanner.hasNext()) {
            String token = scanner.next();
            result.append(token);
            
            // 仅当还有后续内容时,处理分隔符
            if (scanner.hasNext()) {
                MatchResult match = scanner.match();
                String delimiter = match.group(1);
                
                if (delimiter.length() == 1) {
                    // 单个分隔符替换为空格
                    result.append(" ");
                } else {
                    // 双分隔符替换为换行
                    result.append("\n");
                }
            }
        }
        
        scanner.close();
        System.out.println(result);
    }
}

效果验证

输入你提供的测试字符串:

This;is;the;first;line;;This;is;the;second;line!;;;;Done!;;

输出结果:

This is the first line
This is the second line!

Done!

关键注意点

  • 正则匹配顺序必须是双分隔符在前,否则;;会被拆成两个;,导致替换成两个空格而非换行
  • 通过scanner.match().group(1)获取捕获的分隔符,是实现不同替换逻辑的核心
  • 无需额外处理多组连续分隔符(比如;;;;),因为正则会将其拆分为两个;;,对应两次换行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:01:17