簡體   English   中英

搜索單詞而不是字符串?

[英]Searching for a word and not a string?

我想檢查文件中是否有特定單詞,就像我在各種論壇上發布的那樣,是使用以下代碼...

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

沒關系,直到您發現它會搜索和匹配復合詞等。 例如,如果我在文件中搜索字符串light ,但不存在,而是單詞lightning ,它將仍然注冊為找到匹配項...是否可以使用VB.net查找和精確查找單詞?

正如安德魯·莫頓(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

如果願意,您甚至可以通過將其放入Module並添加ExtensionAttribute ,使它成為String類型的擴展方法 ,如下所示:

<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

另一種使用Regex.Matches的方法,該方法允許搜索單詞的集合並返回Dictionary(Of String, Integer())

字典Key將匹配的單詞Value表示為整數數組,在File中找到單詞的所有位置。

擴展方法需要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

最短,最快的方法是使用帶有LINQ查詢的ReadLines ,特別是在處理大文件時。

Dim myword As String = "Book"
Dim reg = New Regex("\b" & myword & "\b", RegexOptions.IgnoreCase)
Dim res = From line In File.ReadLines(largeFileName)
                  Where reg.IsMatch(line)

如果文件包含“書”,“書”,“書”。 和“書籍”,結果將是:

Book
Book,
Book.

您可以按以下方式處理結果

TextBox1.Text = resLines.Count

要么

TextBox1.Text = resLines(0)

進行編輯以使其帶有“。”。 等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM