Regex 在整位数和节位数实体之间拆分字符串

Regex 在整位数和节位数实体之间拆分字符串,regex,string,vb.net,replace,split,Regex,String,Vb.net,Replace,Split,我有一个包含实体的文件。如果有一个完整的数字实体后跟一个分段的数字实体,我需要在它们之间放置一个结束元素 我试着把它放到一个数组中。我尝试使用正则表达式: /&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

我有一个包含实体的文件。如果有一个完整的数字实体后跟一个分段的数字实体,我需要在它们之间放置一个
结束元素

我试着把它放到一个数组中。我尝试使用正则表达式:

/&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;
&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_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)
Dim chapters As List(Of String)=File.ReadAllLines(“[File Path]”)。ToList()
以布尔值表示的值=真
对于整型行=章节。计数-1到0步骤-1
如果章节(第行).包含(“-”c),则
如果没有第章,则插入第章(第+1行“”)
notache=假
其他的
notachage=正确
如果结束
下一个
'请随意命名文件
File.writeAllines(“chapters_new.txt”,chapters)
一个未经检验的理论(我没时间了,不得不走了),在纸上看起来不错,可能会激发一个想法

   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
对于i作为整数=0到8
将文本设置为字符串=“&sc\u 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(“,yourText.LastIndexOf(str)+2)
下一个

您可以将变体与
-
匹配,并利用正向前瞻来断言右侧的内容是一个换行符,后跟不带
-
的变体

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

  • ^
    字符串的开头
  • &sc_Ch\d+-\d+匹配
    &sc\u Ch
    ,1+位,
    -
    和1+位
  • (?=
    正向前瞻
    • (?:\r?\n |\r)
      匹配换行符
    • &sc_Ch\d+;
      匹配
      &sc_Ch
      ,1+位,
  • 关闭正向前瞻
在替换中,使用完全匹配,后跟换行符和


|

So,
&sc\u Ch2
&sc_Ch5
&sc_Ch8不是章节。仅当字符串包含连字符且以下内容不包含连字符时,它才是章节。所以,这里有一个连字符,开始一个章节,没有连字符,这是一个章节,插入。是的,它们已经包含在里面了。最后一节需要增加最后一章。鉴于你之前提出的问题,实际结构似乎比这更复杂。这是您需要修改的字符串的真实序列吗?是的,这正是需要更改的文档。请使用Dim strMasterDoc=file.ReadAllText(existingMasterFilePath)读取文件。这对于字符串的章节列表是否合适。它不接受它不。使用
Dim trMasterDoc作为列表(字符串)=File.ReadAllLines(existingMasterFilePath.ToList()
。如果各章如你在问题中所示以不同的行分开。当然,
trMasterDoc
在这段代码中被称为
chapters
。我如何将文件重新组合在一起,以便其他代码可以在其上运行?我将Dim strMasterDoc=File.ReadAllText(existingMasterFilePath)Dim newMasterFileBuilder设置为用于操作文本的新StringBuilder(strMasterDoc)。因此,我需要您的代码输出strMasterDoc,使其与我剩余的代码一起工作。请参阅编辑和前面的注释(无
File.ReadAllText()
,但
File.ReadAllLines()
,然后
File.writeAllines()
保存)。好的,我理解并将测试它。谢谢你的帮助。你的文字总是会改变,所以我认为这行不通。是的,你需要给坐在我车里看这个的一条新的线写信。我认为,如果你在类范围内声明了你的文本,这将起作用。