Разбить строку между целыми цифрами и цифрами разделов - PullRequest
2 голосов
/ 16 мая 2019

У меня есть файл с сущностями в нем. Там, где есть целая цифра, за которой следует секционная цифра, мне нужно поместить закрывающий элемент </chapter> между ними.

Я пытался поместить его в массив. Я пытался использовать регулярное выражение:

/&Ch\d+\r\n&Ch\d+-\d+

Пример текстового файла:

&sc_Ch2;
&sc_Ch3;
&sc_Ch3-1;
&sc_Ch3-2;
&sc_Ch4;
&sc_Ch4-1;
&sc_Ch4-2;
&sc_Ch5;
&sc_Ch6;
&sc_Ch6-1;
&sc_Ch7;
&sc_Ch7-1;
&sc_Ch7-2;
&sc_Ch7-3;
&sc_Ch7-4;
&sc_Ch8;

Результаты будут:

&sc_Ch2;
&sc_Ch3;
&sc_Ch3-1;
&sc_Ch3-2;
</chapter>
&sc_Ch4;
&sc_Ch4-1;
&sc_Ch4-2;
</chapter>
&sc_Ch5;
&sc_Ch6;
&sc_Ch6-1;
</chapter>
&sc_Ch7;
&sc_Ch7-1;
&sc_Ch7-2;
&sc_Ch7-3;
&sc_Ch7-4;
</chapter>
&sc_Ch8;

Как мне решить эту проблему?

Ответы [ 3 ]

1 голос
/ 16 мая 2019

Непроверенная теория (мне не хватило времени), которая хорошо выглядит на бумаге, которая может вызвать идею

   For i As Integer = 0 To 8
        Dim yourText As String = "&sc_Ch2;
                                    &sc_Ch3;
                                    &sc_Ch3-1;
                                    &sc_Ch3-2;
                                    &sc_Ch4;
                                    &sc_Ch4-1;
                                    &sc_Ch4-2;
                                    &sc_Ch5;
                                    &sc_Ch6;
                                    &sc_Ch6-1;
                                    &sc_Ch7;
                                    &sc_Ch7-1;
                                    &sc_Ch7-2;
                                    &sc_Ch7-3;
                                    &sc_Ch7-4;
                                    &sc_Ch8;"
        Dim str As String = "Ch" & i
        yourText.Insert("</chapter>", yourText.LastIndexOf(str) + 2)

    Next
1 голос
/ 16 мая 2019

Если это фактическая последовательность строк, попробуйте следующее: заполните List(Of String) строками, представляющими ваши главы (чтение из файла или любого другого источника).

Цикл считывает список в обратном направлении, вставляя строку <chapter> в список, когда текущая строка содержит дефис, а предыдущая строка не содержит.

В этом коде предполагается, что определение глав (&sc_Ch[X];) включает дефисы только в этом конкретном случае.

Dim chapters As List(Of String) = File.ReadAllLines("[File Path]").ToList()
Dim NotAChapter As Boolean = True

For line As Integer = chapters.Count - 1 To 0 Step -1
    If chapters(line).Contains("-"c) Then
        If NotAChapter Then chapters.Insert(line + 1, "<chapter>")
        NotAChapter = False
    Else
        NotAChapter = True
    End If
Next

' Name the file as you please
File.WriteAllLines("chapters_new.txt", chapters)
0 голосов
/ 17 мая 2019

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

^&sc_Ch\d+-\d+;(?=(?:\r?\n|\r)&sc_Ch\d+;)

Объяснение

  • ^ Начало строки
  • &sc_Ch\d+-\d+; Совпадение &sc_Ch, 1+ цифр, - и 1+ цифр
  • (?= Положительный прогноз
    • (?:\r?\n|\r) Соответствие новой строки
    • &sc_Ch\d+; Соответствие &sc_Ch, 1+ цифр, ;
  • ) Закрыть положительный прогноз

При замене использовать полное совпадение с последующим переводом строки и </chapter>

Regex demo | vb.net demo

...