【问题标题】:Strategy for Processing a Text File with a Header using Reg Exp in Java在 Java 中使用 Regex 处理带有标题的文本文件的策略
【发布时间】:2015-06-08 08:51:56
【问题描述】:

我有一个文件,其中包含一个带有 cmets 的标题(例如 [Comment] 这是一个注释)和一个后续数据部分。数据从“Mk1=”开始。

我正在开发的程序应该:

  • 复制标题内容
  • 仅在文件的数据部分搜索和替换
  • 将标头和数据写入新文件

我目前正在使用:

  • 字符串缓冲区
  • 扫描仪
  • 正则表达式.模式;

到目前为止,在我的代码中(简化为基本内容):

public static void main(String[] args) {

    File file = readFile("file.ext");

    Scanner inputScanner = null;

    try {
        inputScanner = new Scanner(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    String currentLine = "";

    while(inputScanner.hasNext()) {
        currentLine = inputScanner.findInLine(regexpPattern);

        if (currentLine != null){
             fileOutput.append(currentLine + "\n");
        }
    }

}

由于扫描器的工作方式类似于队列,我无法确定应该使用什么策略。我找到了使用 Matcher 而不是 Scanner 的示例。据我了解,由于 Scanner 具有类似队列的结构,我还必须使用布尔标志。 findInHorizo​​n() 方法似乎没有帮助,因为我希望 reg exp 仅适用于地平线之外。假设我知道标题开始和结束的一系列字符,扫描仪的分隔符是否可能存在“hack”?

文件示例

[Comment]
Text goes here.

[Another Comment]
;Instructions: Below you will find Mk1= where the data can be assigned.
;More text.

Mk1=data
Mk2=data
Mk3=data

我应该使用什么策略?

【问题讨论】:

    标签: java regex replace


    【解决方案1】:

    假设您可以使用 java.nio.file.Files(从 Java 1.7 开始)并且您的文本文件不是太大,我会一次阅读所有行并使用 Matcher:

    Charset charset = Charset.forName("UTF-8");
    List<String> lines = Files.readAllLines(file.toPath(), charset);
    
    for (String line : lines) {
        Matcher matcher = regexpPattern.matcher(line);
    
        if (matcher.matches()) {
            // do something
        }
    }
    

    使用正则表达式组将证明对检索参数值对很有用:

    Pattern dataPattern = Pattern.compile("^Mk(\\d+)=(.*)$");
    Matcher dataMatcher = dataPattern.matcher(line);
    int mk = Integer.parseInt(dataMatcher.group(1));
    String data = dataMatcher.group(2);
    

    【讨论】:

    • 这看起来很有希望。这些文件大约为 31 kB。在每个文件之后关闭 InputStream 就足够了吗?
    • @noumenal 我当然会认为 31 kB 是一个小文件。无需打开或关闭任何文件流,Files.readAllLines() 方法处理文件的打开和关闭,即使出现问题,它也是一种非常适合您的任务的高级方法。它可能会在找不到文件时抛出IOException
    【解决方案2】:

    解析是一个两步过程:您有一个识别输入中的模式的标记器和一个读取标记但也有一个状态来知道它在哪里的解析器。

    您可以将正则表达式用于问题的“标记化”部分,但您还需要一个能够记住“我已经看到 [Comment]”的解析器,以便它知道接下来可能/应该是什么。

    相关:

    【讨论】:

    • 感谢您提供有用的链接。恐怕我现在没有 18 个小时的时间来搞这个材料。有没有我可以专注于解决当前问题的特定讲座?在理想情况下,我将有一个解析器将标题作为字符串读取,并有一个逐行解析器用于数据部分。我认为这将是最佳解决方案。
    • 你不需要一切;我建议先看第 5 章的前 3 个,然后是第 5 章的前两个。如果您不理解这些视频中的内容,请观看其余部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多