【问题标题】:Character at break stripped休息时的角色被剥夺
【发布时间】:2020-07-30 00:17:18
【问题描述】:

我们有这个 VB.NET 方法。

目的:包含多行字符的字符串必须适合打印报告的列。字符串需要预处理以在给定数量的字符之前或之前有换行符,换行符不能是单词或数字的一部分。不能删除除空格以外的任何字符。
更多详情:
- "," 必须在行尾,不能放在新行的开头

我不知道如何解决:换行符处的字符被剥离,除非是空格,否则不应该。

<Extension()>
Public Function SplitOn(ByVal initial As String, ByVal MaxCharacters As Integer) As List(Of String)
        Dim lines As List(Of String) = New List(Of String)()
        If String.IsNullOrEmpty(initial) = False Then
            Dim targetGroup As String = "Line"
            Dim pattern As String = String.Format("(?<{0}>.{{1,{1}}})(?:\W|$)", targetGroup, MaxCharacters)
            lines = Regex.Matches(initial, pattern, RegexOptions.Multiline Or RegexOptions.CultureInvariant).OfType(Of Match)().[Select](Function(mt) mt.Groups(targetGroup).Value).ToList()
        End If
        For i As Integer = 0 To lines.Count - 1
            lines(i) = lines(i).TrimEnd(New Char() {CChar(vbCr), CChar(vbLf)})
        Next

        Return lines
    End Function

测试用例

初始 =
"RW/40mm,6/50mm,4,2
N=6"

案例 1:
MaxCharacters = 10

当前结果:
RW/40mm,6
50mm,4,2
N=6

要求的结果:
RW/40mm,6/
50mm,4,2
N=6

问题:6后的/被剥离,应该保留

案例 2 MaxCharacters = 9

当前结果:
RW/40mm
6/50mm,4
2
N=6

要求的结果:
RW/40mm,
6/50mm,4,
2
N=6

问题:40mm后和4后需要保持

【问题讨论】:

  • 函数的意图是什么?你能edit这个问题告诉我们pattern的值吗?
  • 您为什么希望保留这些字符?您的模式说找到比 MaxCharacters 短的最长字符串,该字符串以非单词字符结尾,被丢弃,因此“RW/40mm,6”是 9 个字符(小于 10 个)并以“/”结尾,被丢弃。
  • @AndrewMorton pattern 在函数中定义。
  • 这似乎是XY Problem。告诉我们您正在尝试完成什么,而不是如何完成它。
  • 感谢您的意见。我已经改进了这个问题。 @NetMage 如何阻止“/”被丢弃?代码的哪一部分正在这样做? (我的正则表达式很弱)

标签: c# .net regex vb.net


【解决方案1】:

@NetMage 给出了答案,谢谢。 "要结束这一行,请使用 (?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    相关资源
    最近更新 更多