0

0

如何使用正则表达式解析无分隔符的固定格式文件并格式化输出

聖光之護

聖光之護

发布时间:2026-01-13 10:32:17

|

351人浏览过

|

来源于php中文网

原创

如何使用正则表达式解析无分隔符的固定格式文件并格式化输出

本文讲解如何解析类似"000001bilbobagginsesq.1020"这样无分隔符的紧凑字符串,通过正则匹配提取字段,并用`printf`或`string.formatted()`实现对齐排版输出。

原始问题中,文件内容是连续拼接、无任何分隔符(如空格、逗号、制表符)的字符串,例如 "000001BilboBagginsEsq.1020"。直接调用 System.out.printf("%-60s", rec) 只是对整行做宽幅左对齐,无法自动拆分字段——这正是你看到 1 000001BilboBagginsEsq.1020 的原因:printf 并未“理解”字段边界,它只是把整个 rec 当作一个字符串处理。

要实现目标格式:

000001          Bilbo              Baggins           Esq.          1020

必须先结构化解析原始字符串,再按字段分别格式化。推荐使用 java.util.regex.Pattern 和 Matcher 进行稳健的字段提取。

✅ 正确步骤:解析 + 格式化

  1. 定义字段规则(基于示例数据推断):

    MuleRun
    MuleRun

    全球首个AI Agent交易平台

    下载
    • 字段1(ID):6位纯数字 → \\d{6}
    • 字段2(First Name):首字母大写 + 小写字母/点/下划线 → [A-Z][a-z._]+
    • 字段3(Last Name):同上
    • 字段4(Title):同上(如 "Esq." 包含点)
    • 字段5(Year):4位数字 → \\d{4}
  2. 编写解析类(推荐封装)

import java.util.regex.*;

class Entry {
    String id, firstName, lastName, title, birthYear;

    static Entry parse(String line) {
        Entry e = new Entry();
        // 精确匹配全部5个字段(避免过度匹配)
        String regex = "(\\d{6})([A-Z][a-z._]+)([A-Z][a-z._]+)([A-Z][a-z._]+)(\\d{4})";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(line);
        if (m.matches()) { // 使用 matches() 确保整行匹配,更安全
            e.id = m.group(1);
            e.firstName = m.group(2);
            e.lastName = m.group(3);
            e.title = m.group(4);
            e.birthYear = m.group(5);
        } else {
            System.err.println("Warning: Line format mismatch — '" + line + "'");
        }
        return e;
    }

    @Override
    public String toString() {
        // 每字段预留15字符宽度,左对齐;年份右对齐更自然(可选)
        return String.format("%-15s%-15s%-15s%-15s%-15s", 
            id, firstName, lastName, title, birthYear);
    }
}
? 提示:String.format() 或 String.formatted()(Java 15+)比链式 += 更高效、可读性更强;%-15s 表示左对齐、最小宽度15。
  1. 在文件读取循环中使用(注意资源管理与异常处理):
JFileChooser chooser = new JFileChooser();
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
    File file = chooser.getSelectedFile();
    try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
        String line;
        int lineNumber = 0;
        while ((line = reader.readLine()) != null) {
            lineNumber++;
            Entry entry = Entry.parse(line.trim()); // trim() 去除可能的首尾空白
            System.out.printf("%-4d %s%n", lineNumber, entry); // 输出:行号 + 格式化记录
        }
    } catch (IOException e) {
        System.err.println("读取文件失败: " + e.getMessage());
    }
}
System.out.println("\nData file read!");

⚠️ 注意事项与优化建议

  • 正则健壮性:若实际数据存在变长(如 ID 不总是 6 位),应调整为 (\\d+) 并配合业务逻辑校验,而非硬编码 {6}。
  • 大小写敏感:当前正则依赖 Bilbo/Baggins 首字母大写。若数据不规范(如全小写),需改用 (?i)[a-z] 或预处理标准化。
  • 性能考虑:若文件极大,可将 Pattern.compile(regex) 提升为 static final Pattern,避免重复编译。
  • 替代方案:若字段长度严格固定(如 ID=6, FirstName=10, LastName=12…),可用 substring() 切片,更快但缺乏容错性。

最终输出效果(含行号):

1    000001         Bilbo          Baggins        Esq.           1020      
2    000002         Frodo          Baggins        Mr.            1050      

通过结构化解析 + 字段级格式化,你就能精准控制每一列的宽度与对齐方式,彻底解决“printf 被忽略”的表象问题——本质不是 printf 失效,而是输入数据尚未被正确分解。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

831

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

733

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 6.6万人学习

Java 教程
Java 教程

共578课时 | 45.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号