【发布时间】:2014-01-30 14:45:31
【问题描述】:
有人知道如何将文本框中每一行的第一个单词小写吗?
不是第一个字母,而是第一个词。
我试过这样但它不起作用:
For Each iz As String In txtCode.Text.Substring(0, txtCode.Text.IndexOf(" "))
iz = LCase(iz)
Next
【问题讨论】:
有人知道如何将文本框中每一行的第一个单词小写吗?
不是第一个字母,而是第一个词。
我试过这样但它不起作用:
For Each iz As String In txtCode.Text.Substring(0, txtCode.Text.IndexOf(" "))
iz = LCase(iz)
Next
【问题讨论】:
当您调用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()
【讨论】:
这里的解决方案很有趣,但它们忽略了 .NET 的一个基本工具:正则表达式。解决方案可以写成一个表达式:
Dim result = Regex.Replace(txtCode.Text, "^\w+",
Function (match) match.Value.ToLower(), RegexOptions.Multiline)
(这需要导入System.Text.RegularExpressions。)
这个解决方案可能比这里的所有其他解决方案更有效(它肯定比大多数解决方案更有效),并且它的代码更少,因此出现错误的机会更少并且更易于理解和维护。
【讨论】:
您的代码的问题是您在整个 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
【讨论】:
遍历文本框的每一行,拆分行中的所有单词,确保 .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
【讨论】:
我使用了你们的想法,我做了这样的:
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函数。