Упростить / оптимизировать регулярные выражения в Java - PullRequest
0 голосов
/ 22 апреля 2019

Я использую библиотеку машинного обучения на Java. Библиотека предоставляет метод с именем readInstances для ввода данных, предварительной обработки и их классификации. Для своих параметров readInstances принимает FileReader, Pattern и индексный массив для позиций полей в каждом наблюдении: readInstances(FileReader file, Pattern lineRegex, int[] fieldIndices).

Через lineRegex библиотека обнаруживает поля, разделенные вкладками. В некоторых полях могут быть пробелы. Кроме того, ни в одном из полей нет вкладки.

Для нашего конкретного проекта каждая запись (наблюдение данных) имеет 17 полей и имеет следующий формат:

"19 инженерных ложно верно Алиса Элис Смит 13168 ком ложно NA 14972 13:36 NA 10 10 30 У вашей компании есть проблемы с мобильными приложениями."

Обратите внимание, что в шестом столбце указано «Алиса Смит», где Алиса и Смит разделены пробелом. 17-й столбец / поле содержит предложение, в котором существует несколько пробелов.

Я написал следующий объект Pattern в readInstances:

String partialPattern="";
for(int i=0; i<17;i++) {
partialPattern+="([^\\t]*)"+"\\t*";
}
Pattern lineRegex = Pattern.compile("^" + partialPattern + "(.*)$");

Регулярное выражение работает нормально. Но я надеюсь, что кто-то сможет пролить свет на то, как написать элегантное регулярное выражение, не обращаясь к конкатенации строк, через переменную «частичный_паттерн».

Обратите внимание:

  • str.split () не является решением. Поэтому любое такое предложение не поможет.
  • Исходный код для readInstances не может быть изменен.
  • Объект Pattern должен быть передан методу readInstances.

1 Ответ

0 голосов
/ 22 апреля 2019

Если вы не можете изменить библиотеку или использовать другой метод для передачи ей своего файла и спецификаций полей, вы можете, по крайней мере, написать регулярное выражение немного более приятным способом:

String pattern = Stream
        .generate(() -> "(\\S*)")
        .limit(17)
        .collect(Collectors.joining("\\t*"));
Pattern lineRegex = Pattern.compile("^" + pattern + "\\t*(.*)$");

(примечание:Я не уверен, что захватывает последний (.*), так как вы упоминаете, что есть 17 полей, и они уже захвачены (\\S*))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...