2010-09-22 5 views
1

Я анализирую файл журнала и пытаюсь совместить утверждения ошибок. Часть строки, которую я сопоставляю с «ошибкой CS», применима к многочисленным строкам, некоторые дубликаты некоторые нет. Есть ли способ, которым я не могу вернуть дубликаты. Использование Java аромат RegEx ..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

+0

См. Также: http://stackoverflow.com/questions/1863957/how-do-i-convert-an-array-of-strings-to-a-array-of-unique-values ​​ – kennytm

+1

В зависимости от структуры вашего файл журнала ошибок, вы можете удалить дубликаты в регулярном выражении. Но я бы рекомендовал сделать это после того, как у вас есть матчи, что-то вроде того, что предложил KennyTM в его ссылке выше – NullUserException

ответ

2

Технически говоря, с регулярным выражением, это не представляется возможным. Вам нужно что-то более мощное.

Регулярные выражения предназначены для соответствия обычным языкам. Шаблон, который вы пытаетесь сопоставить, не является регулярным.

Вам требуется выражение для запоминания некоторого «состояния», ранее согласованных ошибок, а регулярные выражения не предназначены для обработки этого типа вычислений. A Turing Machine способен сохранять состояние. Это больше похоже на то, что вам нужно. (Java прекрасно подойдет к счету.)

Это можно довольно легко решить, добавив дополнительную логику в ваш анализатор журнала после того, как вы найдете все строки ошибок.

2

Одним из решений является сопоставление с вашим регулярным выражением, а затем помещаем строку в структуру данных, такую ​​как set, которая занимается удалением дубликатов для вас. По окончании разбора просто распечатайте содержимое набора.

Если вы обеспокоены порядком, вы можете добавить какую-либо карту с линией в качестве ключа и номера строки в качестве значения (возможно, для соответствия соответствующей записи перед вставкой). Если вы сортируете по значению, вы получите список первого экземпляра данной строки.

+1

Regex для определения структуры данных для фильтрации. Различные инструменты выполняют разные задачи. Если вы были сценарием оболочки, переведите его в '| сортировать | uniq', например (что бы использовать больше памяти, чем то, что вы могли бы программировать, но это еще одна история) –