2010-09-22 104 views
1

我解析日志文件并尝试匹配错误语句。我匹配的“错误CS”这一行的部分将应用于许多行,其中一些不重复。有没有一种方法我不能返回重复项。使用正则表达式的味道的Java ..正则表达式在模式匹配时返回唯一行

例如:我简单的regex返回

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 
+1

您使用哪种语言,Java或C#? – NullUserException 2010-09-22 16:08:22

+0

参见:http://stackoverflow.com/questions/1863957/how-do-i-convert-an-array-of-strings-to-a-array-of-unique-values – kennytm 2010-09-22 16:11:55

+1

根据结构的错误日志文件,您可能会丢弃正则表达式中的重复项。但是我建议你在比赛结束后这么做,比如Kenny在他的链接 – NullUserException 2010-09-22 16:14:39

回答

2

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

正则表达式都是为了匹配正规语言。您尝试匹配的模式不规则。

你需要表达记住一些“状态”,以前匹配的错误,正则表达式并不意味着处理这种类型的计算。 A Turing Machine能够保存状态。这更符合你所需要的内容。 (Java将很好地适应该法案。)

这可以相当容易地通过添加一些额外的逻辑到你的日志分析器,你发现所有的错误行后解决。

2

一种解决方案是使用正则表达式的匹配,然后将行成一个数据结构就像一个set与你删除重复的交易。在解析结束时,只需打印该组的内容。

如果你很在意命令你可以添加到地图某种以线键和行号的值(也许是插入前的匹配项检查)一个。如果按值排序,则会得到给定行的第一个实例的列表。

+1

正则表达式来识别,过滤数据结构。不同的工具提供不同的任务如果你是shell脚本,把它管到'|排序|例如uniq'(这会比你可以编程的东西使用更多的内存,但那是另一回事) – 2010-11-02 16:24:20