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

Java文本解析问题:提取标识作为文件名并生成带注释的C文件

解决Java文本读取器的标识提取与文件生成问题

嘿,我来帮你搞定这个文本解析和文件生成的问题!你的核心困扰在于没法精准划分每个S开头标识对应的内容范围,以及正确提取10位标识作为文件名,咱们用正则表达式+Java文件操作就能完美解决。

步骤1:用正则精准匹配标识与对应内容

首先得写一个能精准捕获每个标识块的正则,既要抓出10位的S开头标识,又要把它对应的内容限定到下一个标识之前。对应的正则模式是:

String pattern = "(S\\d{9})\\s*-\\s*(.*?)(?=\\s*S\\d{9}|$)";

给你拆解一下:

  • (S\\d{9}):专门捕获S开头加9个数字的10位标识,这就是咱们的文件名
  • \\s*-\\s*:匹配标识后面的-,自动忽略前后的空格,适配输入格式
  • (.*?):用非贪婪模式捕获内容,这是解决范围问题的关键——它会在碰到下一个S标识或者文本结尾时立刻停止,不会把后面的内容也吞进来
  • (?=\\s*S\\d{9}|$):正向预查,告诉正则什么时候该停止匹配内容

步骤2:完整Java代码实现

下面是包含解析、内容处理、文件生成的完整代码,直接就能用:

import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TextToCFileParser {
    public static void main(String[] args) {
        // 你的输入示例文本
        String inputText = "S00000050 - Some text 1. S00000060 - Some other text 2. with other text the goes with it";
        
        // 编译正则,加上DOTALL让.能匹配换行符(适配多行输入)
        Pattern pattern = Pattern.compile("(S\\d{9})\\s*-\\s*(.*?)(?=\\s*S\\d{9}|$)", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(inputText);
        
        // 循环匹配每个标识块
        while (matcher.find()) {
            // 提取文件名:10位标识 + .c
            String fileName = matcher.group(1) + ".c";
            // 处理内容:去掉末尾的点、多余空格,整理成注释格式
            String rawContent = matcher.group(2).trim()
                    .replaceAll("\\s+", " ") // 把多个空格/换行换成单个空格
                    .replaceAll("\\.$", ""); // 去掉内容末尾的点
            
            // 生成最终的注释内容
            String fileContent = "/* " + rawContent + " */";
            
            // 写入文件(用try-with-resources自动关闭流)
            try (FileWriter writer = new FileWriter(fileName)) {
                writer.write(fileContent);
                System.out.println("成功生成文件:" + fileName);
            } catch (IOException e) {
                System.err.println("生成文件失败:" + fileName);
                e.printStackTrace();
            }
        }
    }
}

关键细节说明

  • 非贪婪模式.*?:这是解决范围划分问题的核心,它不会像贪婪模式那样把整个文本都吞掉,而是碰到下一个S标识就停止,完美区分每个块的边界
  • Pattern.DOTALL:如果你的输入文本有换行,这个参数能让正则正确匹配跨行的内容
  • 内容处理逻辑:通过trim()、replaceAll()整理内容,确保生成的注释格式整洁,没有多余的符号或空格

测试结果

用你提供的输入文本运行代码,会生成两个符合要求的文件:

  • S00000050.c,内容为:/* Some text 1 */
  • S00000060.c,内容为:/* Some other text 2 with other text the goes with it */

完全满足你的需求!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:57:08