【问题标题】:Lowercase the first word第一个单词小写
【发布时间】:2014-01-30 14:45:31
【问题描述】:

有人知道如何将文本框中每一行的第一个单词小写吗?

不是第一个字母,而是第一个词。

我试过这样但它不起作用:

For Each iz As String In txtCode.Text.Substring(0, txtCode.Text.IndexOf(" "))
     iz = LCase(iz)
Next

【问题讨论】:

    标签: vb.net word lowercase


    【解决方案1】:

    当您调用Substring 时,它会复制该部分字符串并将其作为新的字符串对象返回。因此,即使您成功更改了返回的子字符串的值,它仍然不会更改 Text 属性中的原始字符串。

    然而,.NET 中的字符串是不可变的引用类型,所以当您设置iz = ... 时,您所做的就是重新分配iz 变量以指向另一个新的字符串对象。当您设置iz 时,您甚至不会触及它先前指向的复制子字符串的值。

    为了改变文本框的值,你必须实际为它的Text属性分配一个新的字符串值,像这样:

    txtCode.Text = "the new value"
    

    既然是这种情况,我建议使用StringBuilder 对象构建一个新字符串,然后,一旦修改的字符串完成,然后将文本框的Text 属性设置为该新字符串,例如:

    Dim builder As New StringBuilder()
    For Each line As String In txtCode.Text.Split({Environment.NewLine}, StringSplitOptions.None)
        ' Fix case and append line to builder
    Next
    txtCode.Text = builder.ToString()
    

    【讨论】:

      【解决方案2】:

      这里的解决方案很有趣,但它们忽略了 .NET 的一个基本工具:正则表达式。解决方案可以写成一个表达式:

      Dim result = Regex.Replace(txtCode.Text, "^\w+",
          Function (match) match.Value.ToLower(), RegexOptions.Multiline)
      

      (这需要导入System.Text.RegularExpressions。)

      这个解决方案可能比这里的所有其他解决方案更有效(它肯定比大多数解决方案更有效),并且它的代码更少,因此出现错误的机会更少并且更易于理解和维护。

      【讨论】:

        【解决方案3】:

        您的代码的问题是您在整个 TextBox 文本中 first 单词的每个字符上运行循环only。

        此代码循环遍历每一行并获取第一个单词:

        For Each line As String In txtCode.Text.Split(Environment.NewLine)
            line = line.Trim().ToLower()
        
            If line.IndexOf(" ") > 0 Then
                line = line.Substring(0, line.IndexOf(" ")).Trim()
            End If
        
            // do something with 'line' here
        Next
        

        【讨论】:

          【解决方案4】:

          遍历文本框的每一行,拆分行中的所有单词,确保 .ToLower() 第一个单词:

              Dim strResults As String = String.Empty
          
              For Each strLine As String In IO.File.ReadAllText("C:\Test\StackFlow.txt").Split(ControlChars.NewLine)
          
                  Dim lstWords As List(Of String) = strLine.Split(" ").ToList()
          
                  If Not lstWords Is Nothing Then
          
                      strResults += lstWords(0).ToLower()
          
                      If lstWords.Count > 1 Then
          
                          For intCursor As Integer = 1 To (lstWords.Count - 1)
          
                              strResults += " " & lstWords(intCursor)
          
                          Next
          
                      End If
          
                  End If
          
              Next
          

          【讨论】:

            【解决方案5】:

            我使用了你们的想法,我做了这样的:

            For Each line As String In txtCode.Text.Split(Environment.NewLine)
            
                        Dim abc() As String = line.Split(" ")
                        txtCode.Text = txtCode.Text.Replace(abc(0), LCase(abc(0)))
            
            Next
            

            它是这样工作的。谢谢大家。

            【讨论】:

            • 那只会保留最后一行的第一个单词。
            • 另外,你应该使用abc(0).ToLower()而不是旧的VB6风格的LCase函数。
            • 这段代码所做的事情完全与你想要的不同(它替换了给定单词的所有次出现,它出现在文本中的任何地方),除了有几个其他缺陷(它效率低下,它使用了 Steven 在他的评论中指出的不推荐使用的方法)而且它不必要地复杂。
            • 打印 ||转到||打印 ||这就是我想要的,它就像这样工作..
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-06-21
            • 1970-01-01
            • 2022-11-27
            • 2021-04-30
            • 1970-01-01
            • 2022-11-03
            相关资源
            最近更新 更多