代码之家  ›  专栏  ›  技术社区  ›  Bernie

模式匹配时返回唯一行的正则表达式

  •  1
  • Bernie  · 技术社区  · 14 年前

    我正在分析日志文件并尝试匹配错误语句。我正在匹配的行的部分“错误cs”将应用于许多行,有些重复,有些不重复。有没有办法我不能归还这些复制品。使用Java风格的正则表达式..

    示例:我的简单正则表达式返回

    Class1.cs(16,27): error CS0117: 'string' does not contain a definition for 'empty'
    Class1.cs(34,20): error CS0103: The name 'thiswworked' does not exist in the current context
    Class1.cs(16,27): error CS0117: 'string' does not contain a definition for 'empty'
    Class1.cs(34,20): error CS0103: The name 'thiswworked' does not exist in the current context
    

    希望它返回:

    Class1.cs(16,27): error CS0117: 'string' does not contain a definition for 'empty'
    Class1.cs(34,20): error CS0103: The name 'thiswworked' does not exist in the current context
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Paul Rubel    14 年前

    一种解决方案是使用regexp进行匹配,然后将行放入数据结构中,如 set 为你去除重复的东西。在解析结束时,只需打印集合的内容。

    如果您关心的是顺序,您可以添加到某种类型的映射中,其中行作为键,行号作为值(可能在插入之前检查匹配的条目)。如果按值排序,将得到给定行的第一个实例的列表。

        2
  •  2
  •   jjnguy Julien Chastang    14 年前

    从技术上讲,使用正则表达式,这是不可能的。你需要更强大的东西。

    正则表达式用于匹配正则语言。您试图匹配的模式不是常规模式。

    您需要表达式记住一些“state”、以前匹配的错误,并且正则表达式不用于处理此类计算。一个 Turing Machine 能够保存状态。这更符合你的需要。(Java将很好地满足需求。)

    在找到所有的错误行之后,通过在日志解析器中添加一些额外的逻辑,可以很容易地解决这个问题。