0

0

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

聖光之護

聖光之護

发布时间:2026-01-13 14:23:02

|

984人浏览过

|

来源于php中文网

原创

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

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

你遇到的问题本质并非printf失效,而是rec变量直接存储了原始未解析的整行字符串(如"000001BilboBagginsEsq.1020"),而printf("\n%4d %-60s ", line, rec)只是将整个长串按60字符左对齐打印——这当然无法产生你期望的“字段对齐”效果。

真正需要的是:先结构化解析字段,再分别格式化输出。由于原始数据无空格、逗号等分隔符,必须依赖字段的语义规律(如ID全数字、姓名首字母大写、年份结尾为数字等)进行正则切分。

以下是一个完整、健壮的解决方案:

MuleRun
MuleRun

全球首个AI Agent交易平台

下载

✅ 步骤一:定义结构化数据类与解析逻辑

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Entry {
    private final String id;
    private final String firstName;
    private final String lastName;
    private final String title;
    private final String birthYear;

    // 使用正则精准捕获5个字段:ID(数字) + FirstName(大写开头单词) + LastName(同上) + Title(同上) + Year(数字)
    private static final Pattern PATTERN = Pattern.compile(
        "(\\d+)([A-Z][a-z._]+)([A-Z][a-z._]+)([A-Z][a-z._]+)(\\d+)"
    );

    public static Entry parse(String rawLine) {
        Matcher m = PATTERN.matcher(rawLine);
        if (!m.matches()) {
            throw new IllegalArgumentException("Invalid format: " + rawLine);
        }
        return new Entry(
            m.group(1), m.group(2), m.group(3), m.group(4), m.group(5)
        );
    }

    private Entry(String id, String firstName, String lastName, String title, String birthYear) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.title = title;
        this.birthYear = birthYear;
    }

    @Override
    public String toString() {
        // 每字段分配15字符宽度,左对齐;年份不加空格(右对齐更自然,此处保持左对齐一致性)
        return String.format("%-15s%-15s%-15s%-15s%s", 
            id, firstName, lastName, title, birthYear);
    }
}

✅ 步骤二:在文件读取循环中解析并打印

// 假设 reader 已由 JFileChooser 初始化
int lineNum = 0;
String rec;
while ((rec = reader.readLine()) != null) {
    lineNum++;
    try {
        Entry entry = Entry.parse(rec);
        // 输出:行号 + 格式化后的字段(符合你的示例样式)
        System.out.printf("%d %s%n", lineNum, entry);
    } catch (IllegalArgumentException e) {
        System.err.println("Parse error at line " + lineNum + ": " + e.getMessage());
    }
}
System.out.println("\nData file read!");

⚠️ 关键注意事项

  • 正则可靠性:当前正则假设姓名/头衔均由“首字母大写+小写字母/点/下划线”组成(如 Bilbo, Baggins, Esq.)。若实际数据含空格、连字符(如 Mary-Jane)或小写前缀(如 de Gaulle),需扩展正则,例如 (\\d+)([A-Z][a-z._\\-]+)([A-Z][a-z._\\-]+)([A-Z][a-z._\\-]+)(\\d+)。
  • 边界处理:reader.ready() 不是安全的循环条件(尤其对网络流或缓冲问题),应始终用 readLine() != null 判断。
  • 资源管理:推荐使用 try-with-resources(如答案所示),避免手动 close() 遗漏导致文件句柄泄漏。
  • 性能提示:Pattern.compile() 是开销操作,应定义为 static final,避免在循环内重复编译。

✅ 最终输出效果

输入行:000001BilboBagginsEsq.1020
输出:

1 000001         Bilbo          Baggins        Esq.           1020

完全匹配你的目标格式——字段间由空格对齐,视觉清晰,便于阅读与后续处理。

此方法将“原始字符串→结构化对象→格式化视图”的职责分离,既保证解析准确性,又赋予输出高度可控性,是处理无分隔符定长/变长记录的标准实践。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

247

2023.07.05

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

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

737

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

211

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

349

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

232

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

528

2023.12.06

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

热门下载

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

精品课程

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

共23课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 6.6万人学习

Java 教程
Java 教程

共578课时 | 45.4万人学习

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

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