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

