【问题标题】:find strings of 8+ characters in richtextbox and divide it into two parts according to even and odd在richtextbox中找到8+个字符的字符串,按照奇数和偶数分成两部分
【发布时间】:2020-02-12 00:01:59
【问题描述】:

我正在使用包含单词和句子的richtextbox……但我需要将长单词转换为两部分或将长单词(如 8 个字符或更多字符)然后 8 个字符的单词分成两个部分……但是如果word 包含 9 个字符我想将 4 个字符之一的两个单词和其他 5 个字符的两个单词制作成 5 个字符

我在做拼写检查,我使用置换和组合方法,这让我可以处理只有 8 个字符长的单词。所以我想把长词分成几部分

    ix = 0
    Label6.Text = 0

    For ix = Label6.Text To RichTextBox1.TextLength
        str = Mid(RichTextBox1.Text, ix, 1)

        If str = "آ" Or str = "ا" Or str = "ب" Or str = "ٻ" Or str = "ڀ" Or str = "ت" Or str = "ٿ" Or str = "ٽ" Or str = "ٺ" Then
            tillword = tillword & str

            Label6.Text = tillword.Length
        End If
    Next

【问题讨论】:

  • 请开启 Option Strict。这是一个两部分的过程。首先对于当前项目 - 在解决方案资源管理器中双击我的项目。选择左侧的编译。在 Option Strict 下拉列表中选择 ON。未来项目的第二个 - 转到工具菜单 -> 选项 -> 项目和解决方案 -> VB 默认值。在 Option Strict 下拉列表中选择 ON。这将使您避免在运行时出现错误。
  • 我没有看到您发布的代码与您想要的结果有任何关系。检查 String.Split() 方法以获取单词数组,您可以在循环中检查长度并在长度超过 8 时获取 .Substring()。然后使用 StringBuilder 重建字符串。
  • 所以,当你找到一个超过 8 个字符的单词时,你将它分成两部分(其中一部分(第二部分?)可以是[half word] +1 long)。例如,当一个单词有 16 个以上的字符时,您是否需要将其拆分为 4 个以上的部分?回溯更快,递归更慢。但这取决于文本的长度。

标签: vb.net


【解决方案1】:

欢迎来到 Stack Overflow!

即使您实际上并未在行尾拆分单词和/或添加表示连字符的惯用短划线,您想要执行的操作也可以被视为一种特殊情况。由于您刚刚从这里开始,我已经按照 Mary 在对您的问题的直接评论中建议的那样去做了——使用 String.Split() 来获取单词列表,并使用 StringBuilder 的实例来重建字符串,如下面的代码所示。此控制台应用程序代码应该可以帮助您入门,但您仍然必须自己解决一些问题,或者遍历底部的一些链接以产生更好的输出(如果需要):

Module Module1
    Sub Main()
        Dim test1 As String = "The Quick Brown Fox in Missisippi Jumped over the Lazy Dog in Tallahassee, 
and told his cousin in Texarkansas, saying the word antidisestablishmentarianism while doing it."
        Dim wrds As String() = test1.Split()
        Dim wrd As String
        Dim part1 As String
        Dim part2 As String
        Dim sb As Text.StringBuilder = New System.Text.StringBuilder()
        For Each wrd In wrds
            If wrd.Length > 8 Then
                part1 = wrd.Substring(0, 8)
                part2 = wrd.Substring(8)
                sb.Append(part1)
                sb.Append(" ")
                sb.Append(part2)
                sb.Append(" ")
            Else
                sb.Append(wrd)
                sb.Append(" ")
            End If
        Next
        Dim finalAnswer As String = sb.ToString()
        Console.WriteLine(finalAnswer)
        Console.WriteLine()
        Console.ReadLine()
    End Sub
End Module

这是上面程序的输出:

The Quick Brown Fox in Missisip pi Jumped over the Lazy Dog in Tallahas see, 
and told his cousin in Texarkan sas, saying the word antidise stablishmentarianism while doing it. 

请注意,我给了你你想要的东西,但不一定是你真正想要的东西——antidisestablishmentarianism 的最后一部分仍然太长,字符串,作为分裂,读起来不愉快。这就是为什么它真的不是那么容易,而且在我看来,它几乎是一门艺术。所以……

以下是更多信息和一些链接,供您确保它是您想要的。

首先,这是一个人的Pseudocode for a recursive solution 接近你想要的。

第二,来自another developer (Bjarke Ebert)

Donald E. Knuth 在 他的 TeX 排版系统。这可以说是最好的之一 换行算法 - 在视觉外观方面“最佳” 结果。

第三个,some good suggestions from JasCav here

显然,Donald Knuth 的算法非常出色。虽然有 没有可用的 C# 实现,您是否考虑过转换 C# 的另一种实现? (例如,您可以将 Java 非常接近 C# 的实现。)

HTH。

【讨论】:

  • 看起来 OP 需要将 8 个以上字符的单词分成两部分(或更多,取决于字符串的长度?)。当字符串长度为 8+ 时,您将获取字符串的前 8 个字符,其余部分保持不变。例如,Mississippi 应该变为 Missi + ssippi。不清楚antidisestablishmentarianism应该如何拆分。
  • @Jimi - 这是故意的 - 如果他是学生,我不想为他做所有的作业;-) 请看我已经在“注意我给了你你想要的,但不一定是你真正想要的……”老师总是给学生留一些作业……这样他们就可以学习了。
  • OP 的问题(或之前的问题)中的哪些内容让您想到了作业?另外,这对其他访客有什么用处?请注意,这个问题的答案比乍一看更为复杂(仅考虑某些语言的连字恶作剧)。
  • @Jimi - 你可能是对的 - 我对连字知之甚少。听起来您有足够的能力提出自己的答案;-) 我实际上很想看看您能做什么,听起来会很有趣。也感谢你挑战我(尽管我仍然认为我做得很好。让我们看看你能不能展示我应该做什么。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2014-01-05
  • 2016-11-27
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多