【问题标题】:Split String New Line After 3 Space in VB.net在 VB.net 中的 3 个空格后拆分字符串新行
【发布时间】:2020-03-03 10:04:26
【问题描述】:

我在 vb.net 中将字符串拆分为换行符时遇到问题。 现在我可以将其拆分为一个空格。我想在 3 个空格后拆分新行。

Dim s As String = "SOMETHING BIGGER THAN YOUR DREAM" 
Dim words As String() = s.Split(New Char() {" "c})

For Each word As String In words
      Console.WriteLine(word)                                         
Next

output :
SOMETHING 
BIGGER 
THAN 
YOUR 
DREAM

Desire output :
SOMETHING BIGGER THAN 
YOUR DREAM

【问题讨论】:

  • 你可以匹配一个组中的 3 个单词,然后替换为组和换行符 (\S+(?:\s+\S+){2})\s* regex101.com/r/N2L7PS/1,而不是拆分

标签: string vb.net split newline


【解决方案1】:

添加到现有有效答案的另一种选择可能是:

Dim separator As Char = CChar(" ")
Dim sArr As String() = "SOMETHING BIGGER THAN YOUR DREAM".Split(separator)
Dim indexOfSplit As Integer = 3

Dim sFinal As String = Join(sArr.Take(indexOfSplit).ToArray, separator) & vbNewLine &
                       Join(sArr.Skip(indexOfSplit).ToArray, separator)

Console.WriteLine(sFinal)

【讨论】:

  • 非常聪明。 .Take 和 .Skip 的大量使用只需要一个索引变量。
  • 谢谢@Mary。我要改变对你的看法(你内心不仅有批评,这么想也很舒服)。 ;)
【解决方案2】:

您可以拆分输入字符串,然后循环生成的部分数组并将它们添加到 StringBuilder 对象。
当您读取的部分数量是定义值的倍数时(wordsPerLine,此处),您将 vbNewLine 附加到当前部分。

循环完成后,将 StringBuilder 的内容打印到控制台:

Dim input As String = "SOMETHING BIGGER THAN YOUR DREAM, NOT MORE THAN YOUR ACCOUNT BALANCE"

Dim wordsPerLine As Integer = 3
Dim wordsCounter As Integer = 1
Dim sb As StringBuilder = New StringBuilder()

For Each word As String In input.Split()
    sb.Append(word & If(wordsCounter Mod wordsPerLine = 0, vbNewLine, " "))
    wordsCounter += 1
Next
Console.WriteLine(sb.ToString())

打印:

SOMETHING BIGGER THAN
YOUR DREAM, NOT
MORE THAN YOUR
ACCOUNT BALANCE 

【讨论】:

    【解决方案3】:

    您可以在一个捕获组中捕获 3 个单词并匹配尾随的空白字符,而不是使用拆分。

    在替换中使用组,后跟换行符。

    图案

    (\S+(?:\s+\S+){2})\s*
    

    这将匹配:

    • (捕获组1
      • \S+ 匹配 1+ 个非空白字符
      • (?:\s+\S+){2} 重复 2 次匹配 1+ 个空白字符和 1+ 个非空白字符
    • )关闭第一组
    • \s* 匹配尾随空白字符

    .NET Regex demo | VB.NET demo

    示例代码

    Dim s As String = "SOMETHING BIGGER THAN YOUR DREAM"
    Dim output As String = Regex.Replace(s, "(\S+(?:\s+\S+){2})\s*", "$1" + Environment.NewLine)
    Console.WriteLine(output)
    

    输出

    SOMETHING BIGGER THAN
    YOUR DREAM
    

    【讨论】:

    • 对未来读者来说是一个很好的答案,但你真的认为这张海报已经准备好使用正则表达式了吗?
    • @Mary 你永远不知道 :) 如何解决它是一种选择。
    • 感谢您的补充说明。
    【解决方案4】:

    String.Join 有一个可以帮助你的重载。

    第一个参数是数组元素之间使用的字符。

    第二个参数是你要加入的数组。

    第三个参数是起始位置,对于您想要的输出中的第一行,这将是索引 0 处的元素。

    第四个参数是要使用的长度,第一行我们需要三个数组元素。

    Private Sub OPCode()
        Dim s As String = "SOMETHING BIGGER THAN YOUR DREAM"
        Dim words As String() = s.Split(New Char() {" "c})
        Dim line1 As String = String.Join(" ", words, 0, 3)
        Console.WriteLine(line1)
        Dim line2 As String = String.Join(" ", words, 3, words.Length - 3)
        Console.WriteLine(line2)
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多