搜索单词而不是字符串?

时间:2019-04-08 15:34:53

标签: string vb.net contains word

我想检查文件中的特定单词,就像我在各种论坛上发布的那样,是使用以下代码...

Dim content = My.Computer.FileSystem.ReadAllText(filePath)
If content.Contains("stringToSearch") Then
    'Do your stuff
End If

没关系,直到您发现它会搜索和匹配复合词等。例如,如果我在文件中搜索字符串light,但不存在,而是单词lightning,它将仍然注册为找到匹配项...是否有找到和匹配的方法使用VB.net确切的单词?

3 个答案:

答案 0 :(得分:3)

正如安德鲁·莫顿(Andrew Morton)所提到的,正则表达式使这种事情非常容易。例如,如果您创建了这样的函数:

Public Function ContainsWord(input As String, word As String) As Boolean
    Return Regex.IsMatch(input, $"\b{word}\b")
End Function

您可以这样使用它:

Dim content = My.Computer.FileSystem.ReadAllText(filePath)
If ContainsWord(content, "stringToSearch") Then
    'Do your stuff
End If

如果愿意,您甚至可以将其放入String类型的extension method,方法是将其放入模块中并添加ExtensionAttribute,如下所示:

<Extension>
Private Function ContainsWord(input As String, word As String) As Boolean
    Return Regex.IsMatch(input, $"\b{word}\b")
End Function

然后您可以这样称呼它:

Dim content = My.Computer.FileSystem.ReadAllText(filePath)
If content.ContainsWord("stringToSearch") Then
    'Do your stuff
End If

答案 1 :(得分:-1)

另一种使用Regex.Matches的方法,该方法允许搜索单词集合并返回Dictionary(Of String, Integer())

字典 Key 将匹配的词 Value 表示为整数数组,表示文件中所有位置,找到了单词。

扩展方法需要2个参数:
-要搜索的文件的路径
-布尔值,用于指定搜索是否应区分大小写。

建议作为IEnumerable(Of String)的扩展方法:

Dim fileName As String = "[File Path]"
Dim searchWords As String() = {"light", "lighting", "clip", "clipper", "somethingelse"}
Dim result = searchWords.FindWords(fileName, False)

打印找到的匹配项的结果:

result.ToList().ForEach(
    Sub(w)
        Console.WriteLine($"Word: {w.Key} Positions: {String.Join(", ", w.Value)}")
    End Sub)

扩展方法:

Imports System.IO
Imports System.Runtime.CompilerServices
Imports System.Text
Imports System.Text.RegularExpressions

Module modIEnumerableExtensions

    <Extension()>
    Public Function FindWords(words As IEnumerable(Of String),
                              fileName As String,
                              caseSentive As Boolean) As Dictionary(Of String, Integer())
        Dim pattern As StringBuilder = New StringBuilder()
        pattern.Append(String.Concat(words.Select(Function(w) $"\b{w}\b|")))

        Dim options As RegexOptions = RegexOptions.Compiled Or
            If(caseSentive, RegexOptions.Multiline, RegexOptions.IgnoreCase Or RegexOptions.Multiline)

        Dim regx As New Regex(pattern.ToString().TrimEnd("|"c), options)
        Dim matches As MatchCollection = regx.Matches(File.ReadAllText(fileName))

        Dim groups = matches.OfType(Of Match).
            GroupBy(Function(g) g.Value).
            ToDictionary(Function(g) g.Key, Function(g) g.Select(Function(m) m.Index).ToArray())
        Return groups
    End Function
End Module

答案 2 :(得分:-1)

最短,最快的方法是对LINQ查询使用ReadLines,特别是在处理大文件时。

Book
Book,
Book.

如果文件包含“书”,“书”,“书”。和“书”,结果将是:

TextBox1.Text = resLines.Count

您可以按以下方式处理结果

TextBox1.Text = resLines(0)

{{1}}

已编辑,以使其包含“。”和“,”等。