如何在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
相关产品推荐
相关产品推荐

