这种模式是什么意思?

时间:2019-07-06 12:47:33

标签: java

我有一个用于自动化数据分析的脚本。不幸的是,我不知道输入数据文件的格式。我发现这段代码旨在在执行分析之前将文件格式与某些先决条件相匹配。您可以帮助您了解模式的含义吗?

class PostSerializer(...):
    black_listed = ProfileSerializer(many=True, required=False)
    # __________________________________________^

1 个答案:

答案 0 :(得分:7)

此行是如何不编写Java的主类。只有一个真正的高手才能将这么多错误整合到一行中。

  1. 我们可以谈谈在一行上初始化两个常量吗?不要那样做永远不要那样做。 Pattern.compile()是静态方法。链接静态方法调用是精神错乱。

    private static final Pattern oldFileHeaderPattern = Pattern.compile("\\s*^\\s*(1|0)\\s*$.*", 40);
    private static final Pattern newFileHeaderPattern = Pattern.compile("\\s*^\\s*(-1|0|1)\\s+(-1|0|1)\\s*$.*", 40);
    
  2. 硬编码魔术数字40伤了我的心灵。如果要多个标志,应该将不同的命名常量或在一起。不要写出号码。

    private static final Pattern oldFileHeaderPattern = Pattern.compile("\\s*^\\s*(1|0)\\s*$.*", Pattern.DOTALL | Pattern.MULTILINE);
    private static final Pattern newFileHeaderPattern = Pattern.compile("\\s*^\\s*(-1|0|1)\\s+(-1|0|1)\\s*$.*", Pattern.DOTALL | Pattern.MULTILINE);
    
  3. 现在让我们谈谈\\s*^$.*。怀疑在^$锚之前和之后匹配事物。通常,您将它们放在正则表达式的开头和结尾,以要求正则表达式匹配整行,然后将其命名为一天。

    使用*意味着它们可以匹配零个字符,因此它们实际上不会更改匹配的内容。让我们删除它们,只使用^$。这意味着我们也可以摆脱DOTALL,因为.已经消失了。

    private static final Pattern oldFileHeaderPattern = Pattern.compile("^\\s*(1|0)\\s*$", Pattern.MULTILINE);
    private static final Pattern newFileHeaderPattern = Pattern.compile("^\\s*(-1|0|1)\\s+(-1|0|1)\\s*$", Pattern.MULTILINE);
    

正则表达式现在看起来还不错,不是吗?第一个寻找由10组成的一行,两边各有一个空白。第二个查找具有两个数字的行,每个数字分别是-101