Java - разбиение файла на разделы - PullRequest
0 голосов
/ 28 января 2019

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

1.

2.

3.

и т. д., но также могут быть

1.1

2.3.1.II.

и т. Д.

Теперь я знаю основы чтения.Мне нужно знать, есть ли хороший способ обнаружить и разделить текст на разделы.

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

Обновление

пример:

1. Position
1.1. Position.
1.2. Scope
1.3. Location. 
2. Compensation
2.1. Schedule
2.2. 
3. Term
3.1. Term.
3.1.i. bla
3.1.ii. bla bla

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вы можете использовать это регулярное выражение для разделения и захвата пронумерованного раздела в группе 1 и раздела абзаца в группе 2.

^((?:[a-zA-Z\d]{1,2}\.)+)\s+(.*)

Здесь ^((?:[a-zA-Z\d]{1,2}\.)+) захватывает пронумерованный раздел, который начинается с одного-двух буквенно-цифровых символов, за которыми следуетцелой литеральной точкой один или несколько раз.Затем следует пробел, следовательно, \s+, затем (.*) захватывает оставшийся текст, который считается абзацем.С вашими данными примера, это то, что я придумал.Если вам нужно, чтобы другие случаи были охвачены по-другому, пожалуйста, добавьте больше образцов, и я предоставлю вам дальнейшее уточненное решение.

Демо

Вотобразец кода Java,

List<String> list = Arrays.asList("1. Position", "1.1. Position.", "1.2. Scope", "1.3. Location. ",
        "2. Compensation", "2.1. Schedule", "2.2. ", "3. Term", "3.1. Term.", "3.1.i. bla", "3.1.ii. bla bla",
        "12.a. some para", "13.a. some para", "1.a. some para", "A.1.a. another para", "B.1.a. some para");
Pattern p = Pattern.compile("^((?:[a-zA-Z\\d]+\\.)+)\\s+(.*)");

list.stream().forEach(x -> {
    Matcher m = p.matcher(x);
    if (m.matches()) {
        System.out.println(x + " --> " + "number section: ("+m.group(1)+")" + " para section: ("+m.group(2)+")");
    }
});

Печать,

1. Position --> number section: (1.) para section: (Position)
1.1. Position. --> number section: (1.1.) para section: (Position.)
1.2. Scope --> number section: (1.2.) para section: (Scope)
1.3. Location.  --> number section: (1.3.) para section: (Location. )
2. Compensation --> number section: (2.) para section: (Compensation)
2.1. Schedule --> number section: (2.1.) para section: (Schedule)
2.2.  --> number section: (2.2.) para section: ()
3. Term --> number section: (3.) para section: (Term)
3.1. Term. --> number section: (3.1.) para section: (Term.)
3.1.i. bla --> number section: (3.1.i.) para section: (bla)
3.1.ii. bla bla --> number section: (3.1.ii.) para section: (bla bla)
12.a. some para --> number section: (12.a.) para section: (some para)
13.a. some para --> number section: (13.a.) para section: (some para)
1.a. some para --> number section: (1.a.) para section: (some para)
A.1.a. another para --> number section: (A.1.a.) para section: (another para)
B.1.a. some para --> number section: (B.1.a.) para section: (some para)
0 голосов
/ 28 января 2019

Вы можете сопоставить заголовки с регулярным выражением, как этот (при условии, что римские цифры от u до X):

^((?:(?:\d+|I{1,3}|IV|VI{0,3}|IX|X)\.)+)

Демо

Объяснение:

  • ^ начало строки
  • \d+|I{1,3}|IV|VI{0,3}|IX|X - соответствует номеру:

    • \d+ цифр
    • I{1,3}|IV|VI{0,3}|IX|X римские цифры
  • (?:...) группы без захвата

  • \. точка, разделяющая цифры
  • (...) + повторение NUMERAL DOT групп один или несколько раз

РЕДАКТИРОВАТЬ:

В java вам нужно экранировать шаблон (чтобы его правильно интерпретировал java) и использовать Pattern.MULTILINE (так что ^ отмечает начало строки, а не начало строки):

Pattern.compile("^((?:(?:\\d+|I{1,3}|IV|VI{0,3}|IX|X)\\.)+)", Pattern.MULTILINE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...