有人知道如何为文本框中的每一行小写第一个单词吗?
不是第一个字母,第一个字。
我尝试过这样但不起作用:
For Each iz As String In txtCode.Text.Substring(0, txtCode.Text.IndexOf(" "))
iz = LCase(iz)
Next
答案 0 :(得分:3)
当你调用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()
答案 1 :(得分:3)
这里的解决方案很有意思,但它们忽略了.NET的基本工具:正则表达式。该解决方案可以在一个表达式中编写:
Dim result = Regex.Replace(txtCode.Text, "^\w+",
Function (match) match.Value.ToLower(), RegexOptions.Multiline)
(这需要导入System.Text.RegularExpressions
。)
这个解决方案可能比这里的所有其他解决方案更有效(它的绝对比大多数解决方案更高效),并且代码更少,因此错误的机会更少,更容易理解和维护。
答案 2 :(得分:1)
您的代码存在的问题是您在整个TextBox文本中的第一个字的每个字符上运行仅循环。
此代码循环遍历每一行并取第一个字:
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
答案 3 :(得分:1)
循环遍历文本框的每一行,拆分行中的所有单词,确保.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
答案 4 :(得分:-2)
我使用了你的想法,我就是这样做的:
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
它的工作原理如下。谢谢大家。