字符串的视觉基本搜索文本,以适当的大小写显示结果
visual basic search text for string, display results with propercase
...databox.text(来自下面的示例代码)包含以前在程序中填充的大量组合词(域名)。每行有 1 个。在此示例中,它最初看起来像:
thepeople.com
truehistory.com
workhorse.com
whatever.com
neverchange.com
...
下面的代码将数据框内的文本保存到 tlistfiltered.txt,然后搜索 tlistfiltered.txt 以检索包含列表 "arr()" 中任何项目的所有行,然后填充listview(lv) 与结果。这工作得很好,但结果看起来像:
thepeople.com
truehistory.com
neverchange.com
...
但我需要的是 "found string"(来自 arr()list 的正确大小写,因此结果将是:
thePeople.com
trueHistory.com
neverChange.com
这是代码....
Dim s As String = databox.Text
File.WriteAllText(dloc & "tlistfiltered.txt", s)
databox.Clear()
Dim text2() As String = System.IO.File.ReadAllLines(dloc & "tlistfiltered.txt")
Dim arr() As String = {"people", "history", "change"}
For index1 = 0 To arr.GetUpperBound(0)
Dim YesLines() As String = Array.FindAll(text2, Function(str As String)
Return str.Contains(arr(index1))
End Function).ToArray
databox.Visible = True
For index2 = 0 To YesLines.GetUpperBound(0)
Dim match As String = (YesLines(index2)) & vbCrLf
databox.AppendText(match)
Next
Next
s = databox.Text
File.WriteAllText(dloc & "tlistfilteredfinal.txt", s)
databox.Clear()
domains = (From line In File.ReadAllLines(dloc & "tlistfilteredfinal.txt") Select New ListViewItem(line.Split)).ToArray
lv.Items.Clear()
My.Computer.FileSystem.DeleteFile(dloc & "tlistfiltered.txt")
My.Computer.FileSystem.DeleteFile(dloc & "tlistfilteredfinal.txt")
BackgroundWorker1.RunWorkerAsync()
End Sub
有没有办法即时执行此操作?我试过 StrConv 等,但它只会将整行转换为正确的大小写。我只想转换行中包含的 "found" 单词....
编辑:
看到@soohoonigan 的回答后,我编辑了
databox.Visible = True
For index2 = 0 To YesLines.GetUpperBound(0)
Dim match As String = (YesLines(index2)) & vbCrLf
databox.AppendText(match)
Next
Next
对此:
databox.Visible = True
For index2 = 0 To YesLines.GetUpperBound(0)
Dim match As String = (YesLines(index2)) & vbCrLf
Dim myTI As System.Globalization.TextInfo = New System.Globalization.CultureInfo("en-US", False).TextInfo
If match.Contains(arr(index1)) Then
match = match.Replace(arr(index1), myTI.ToTitleCase(arr(index1)))
'StrConv(match, vbProperCase)
databox.AppendText(match)
End If
Next
得到了想要的结果!
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim test As String = "thepeople.com"
Dim search As String = "people"
Dim myTI As System.Globalization.TextInfo = New System.Globalization.CultureInfo("en-US", False).TextInfo
If test.Contains(search) Then
test = test.Replace(search, myTI.ToTitleCase(search))
MsgBox(test)
End If
Me.Close()
End Sub
结束Class
例如,我不确定是否需要在中间步骤中使用文件并在最后删除它们。
第一步:获取输入的行
这可以通过使用数据箱的 Lines
属性 来完成(我怀疑它是 TextBox
或 RichTextBox
;如果不是这样,我们仍然可以使用 Split文本 属性)
Dim lines = databox.Lines ' or databox.Text.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
- 第二步:我们要过滤那些行,只保留包含搜索文本的行
为此有几种方法,一个简单的方法是使用 Linq 查询来完成工作
第三步:将筛选结果替换为大写形式的搜索文本
所以我们继续开始的查询并添加一个投影(或映射)来进行转换。
为此,我们需要使用 TextInfo.ToTitleCase
。
' See soohoonigan answer if you need a different culture than the current one
Dim textInfo = System.Globalization.CultureInfo.CurrentCulture.TextInfo
Dim query = From word in arr
From line in lines
Where line.Contains(word)
Let transformed = line.Replace(word, textInfo.ToTitleCase(word))
select transformed
' We could omit the Let and do the Replace directly in the Select Clause
...databox.text(来自下面的示例代码)包含以前在程序中填充的大量组合词(域名)。每行有 1 个。在此示例中,它最初看起来像:
thepeople.com
truehistory.com
workhorse.com
whatever.com
neverchange.com
...
下面的代码将数据框内的文本保存到 tlistfiltered.txt,然后搜索 tlistfiltered.txt 以检索包含列表 "arr()" 中任何项目的所有行,然后填充listview(lv) 与结果。这工作得很好,但结果看起来像:
thepeople.com
truehistory.com
neverchange.com
...
但我需要的是 "found string"(来自 arr()list 的正确大小写,因此结果将是:
thePeople.com
trueHistory.com
neverChange.com
这是代码....
Dim s As String = databox.Text
File.WriteAllText(dloc & "tlistfiltered.txt", s)
databox.Clear()
Dim text2() As String = System.IO.File.ReadAllLines(dloc & "tlistfiltered.txt")
Dim arr() As String = {"people", "history", "change"}
For index1 = 0 To arr.GetUpperBound(0)
Dim YesLines() As String = Array.FindAll(text2, Function(str As String)
Return str.Contains(arr(index1))
End Function).ToArray
databox.Visible = True
For index2 = 0 To YesLines.GetUpperBound(0)
Dim match As String = (YesLines(index2)) & vbCrLf
databox.AppendText(match)
Next
Next
s = databox.Text
File.WriteAllText(dloc & "tlistfilteredfinal.txt", s)
databox.Clear()
domains = (From line In File.ReadAllLines(dloc & "tlistfilteredfinal.txt") Select New ListViewItem(line.Split)).ToArray
lv.Items.Clear()
My.Computer.FileSystem.DeleteFile(dloc & "tlistfiltered.txt")
My.Computer.FileSystem.DeleteFile(dloc & "tlistfilteredfinal.txt")
BackgroundWorker1.RunWorkerAsync()
End Sub
有没有办法即时执行此操作?我试过 StrConv 等,但它只会将整行转换为正确的大小写。我只想转换行中包含的 "found" 单词....
编辑:
看到@soohoonigan 的回答后,我编辑了
databox.Visible = True
For index2 = 0 To YesLines.GetUpperBound(0)
Dim match As String = (YesLines(index2)) & vbCrLf
databox.AppendText(match)
Next
Next
对此:
databox.Visible = True
For index2 = 0 To YesLines.GetUpperBound(0)
Dim match As String = (YesLines(index2)) & vbCrLf
Dim myTI As System.Globalization.TextInfo = New System.Globalization.CultureInfo("en-US", False).TextInfo
If match.Contains(arr(index1)) Then
match = match.Replace(arr(index1), myTI.ToTitleCase(arr(index1)))
'StrConv(match, vbProperCase)
databox.AppendText(match)
End If
Next
得到了想要的结果!
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim test As String = "thepeople.com"
Dim search As String = "people"
Dim myTI As System.Globalization.TextInfo = New System.Globalization.CultureInfo("en-US", False).TextInfo
If test.Contains(search) Then
test = test.Replace(search, myTI.ToTitleCase(search))
MsgBox(test)
End If
Me.Close()
End Sub
结束Class
例如,我不确定是否需要在中间步骤中使用文件并在最后删除它们。
第一步:获取输入的行
这可以通过使用数据箱的Lines
属性 来完成(我怀疑它是TextBox
或RichTextBox
;如果不是这样,我们仍然可以使用 Split文本 属性)Dim lines = databox.Lines ' or databox.Text.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
- 第二步:我们要过滤那些行,只保留包含搜索文本的行
为此有几种方法,一个简单的方法是使用 Linq 查询来完成工作 第三步:将筛选结果替换为大写形式的搜索文本
所以我们继续开始的查询并添加一个投影(或映射)来进行转换。
为此,我们需要使用TextInfo.ToTitleCase
。' See soohoonigan answer if you need a different culture than the current one Dim textInfo = System.Globalization.CultureInfo.CurrentCulture.TextInfo Dim query = From word in arr From line in lines Where line.Contains(word) Let transformed = line.Replace(word, textInfo.ToTitleCase(word)) select transformed ' We could omit the Let and do the Replace directly in the Select Clause