Как разбить строку MCQ (вопросы с множественным выбором) с помощью регулярного выражения - PullRequest
1 голос
/ 29 февраля 2020

Я пытаюсь разбить строку, извлеченную из документа PDF. вот строка ...

"1. Первый главный редактор" Swadesabhimani ": (A) Вакком Абдул Хадар Маулави (C) К. Рамакришна Пиллаи (B) Сэр. C. П. Говинда Пиллаи (D) Г. Парамесваран Пиллаи 2. «Митра мела», тайное общество, организованное: (A) Б.Г. Тилаком (C) Маданом Лал Дингрой (B) Сачин Санья (D) Саваркаром 3. Схема «Лексхамведу» была запущена: (A) А. К. Гопаланом (C) Паттом. A. Thanupillai (B) EK Nayanar (D) MN Govindan Nair 4. Закон, касающийся воды (предотвращение и контроль загрязнения): (A) 1974 (B) 1981 (C) 2002 (D) 1986 Расширенная форма NFAI: (A) Национальная кинопремии Индии (B) Национальная киноакадемия Индии (C) Национальный киноархив Индии (D) Национальное управление кинематографии Индии 6. Какие из следующих законов запрещают Сати и сделал это незаконным? (A) Закон 1870 года (B) Закон Шарады 1930 года (C) Закон о бенгальском регулировании 1795 года (D) Закон о регулировании XVII декабря 1829 года 7 Освободителем индийской прессы был: (A) Чарльз Меткалф (C) Джон Адамс (B) Лорд Уэсли (D) Лорд Гастингс "

Проблема

1) Отсутствует номер вопроса для пятого вопроса.

2) шестое имеет знак вопроса (?) Вместо (:) в конце вопроса

3) седьмое пропускает точку (.) После номера вопроса

мой желаемый выходные данные представляют собой отдельные строки для каждого набора опций, например

"1. Первый главный редактор «Swadesabhimani»: (A) Вакком Абдул Хадар Маулави (C) К. Рамакришна Пиллаи (B) сэр. C .P. Говинда Пиллаи (D) Г. Парамесваран Пиллаи "

" 2. «Митра мела», тайное общество было организовано: (A) Б.Г. Тилаком (C) Маданом Лал Дингрой (B) Сачин Саней (D) Саваркар »

и так далее ...

вот что я пробовал

1.

Pattern p=Pattern.compile("[0-9][.][a-zA-Z0-9]*");
String[] s=p.split(mcqString);

2.

Pattern p=Pattern.compile("[0-9][.]?[a-zA-Z0-9]*[:|?][a-zA-Z0-9]*");
String[] s=p.split(mcqString);

И другие комбинации, но ничего не работает полностью

1 Ответ

1 голос
/ 29 февраля 2020

Все ваши вопросы содержат части с ([A-Z])

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

^(?:(?!\([A-Z]\)).*\R)+(?:\([A-Z]\).*\R*)+

Объяснение

  • ^ Начало строки
  • (?: Группа без захвата
    • (?!\([A-Z]\)) Отрицательный взгляд вперед, утверждение справа не является символом AZ между ()
    • .*\R Соответствует любому символу, кроме новой строки и последовательности новой строки в Юникоде
  • )+ Закрыть группу и повторить 1+ раза, чтобы получить хотя бы 1 строку
  • (?: Не захватывать группу
    • \([A-Z]\).*\R* Матч символ AZ между (), 1+ раз любым символом и необязательной последовательностью перевода строки в юникоде
  • )+ Закрыть группу и повторить 1+ раза, чтобы получить хотя бы 1 строку

In Java

final String regex = "^(?:(?!\\([A-Z]\\)).*\\R)+(?:\\([A-Z]\\).*\\R*)+";

Regex demo | Java демо

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