Regex для возврата уникальных строк при сопоставлении с шаблоном

Я анализирую файл журнала и пытаюсь сопоставить сообщения об ошибках. Часть строки, которую я соответствую "ошибка 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

2 ответа

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

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

Вы требуете, чтобы выражение запомнило некоторое "состояние", ранее найденные ошибки и регулярные выражения, не предназначенные для обработки этого типа вычислений. Машина Тьюринга способна сохранять состояние. Это больше похоже на то, что вам нужно. (Java будет отвечать всем требованиям.)

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

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

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

Другие вопросы по тегам