在整个数字和部分数字实体之间分割字符串

时间:2019-05-16 19:50:42

标签: regex string vb.net replace split

我有一个包含实体的文件。在有一个完整的数字实体和一个分段的数字实体的地方,我需要在它们之间放置一个</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 个答案:

答案 0 :(得分:1)

如果这是实际的字符串序列,请尝试以下操作:在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)

答案 1 :(得分:1)

一种未经检验的理论(我已经用完了,得走了),看起来很不错,可能会激发一个想法

   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

答案 2 :(得分:0)

您可以将变体与-匹配,并使用正向先行断言右边的内容是换行符,然后是没有-的变体

^&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