2 Stimmen

VB.net Begriffe innerhalb einer Zeichenfolge suchen?

    Dim keys1() As String = {"korrupt", "selbstsüchtig", "Macht", "Lügen", "Lügen", "Medien"}
    Dim terms1 As Integer = 0
    Dim terms1string As String = ""
    terms1string = Console.ReadLine()
    For Each st As String In keys1
        terms1 = terms1 + 1
    Next
    If terms1 < 2 Then
        Console.WriteLine("juhu!")
    Else
        Console.WriteLine("DuFehlschlag")
    End If

Hier ist mein Code. Ich möchte, dass es so ist, dass es "juhu" schreibt, wenn Ihr eingegebener String mehr als zwei dieser Begriffe enthält, wenn nicht, dann schreibt es "DuFehlschlag".

---update 8/29/12---

    Function StageTwo(ByVal fname, ByVal lname, ByVal city)
    Console.WriteLine("Beschreibe die Regierung der Vereinigten Staaten.")
    Dim overall As Integer = 0
    Dim keys1() As String = {"korrupt", "selbstsüchtig", "Macht", "Lügen", "Lügen", "Medien"}
    Dim terms1 As Integer = 0
    Dim terms1string As String = ""
    terms1string = Console.ReadLine()
    For Each st As String In keys1
        If InStr(terms1string, st) > 0 Then '<< 0 Then '<<

`

Das ist mein neuer Code. Es funktioniert immer noch nicht, es druckt "Test fehlgeschlagen" aus, nachdem "korrupt" für den ersten und "kaputt" für den zweiten eingegeben wurde. Kannst du mir wieder helfen? Vielen Dank, Leute.

`

1 Stimmen

Schau dir RegEx an. Es ist etwas steil, aber definitiv eine Investition.

2voto

sloth Punkte 95218

Warum so kompliziert? Verwenden Sie einfach Count:

Dim keys1() As String = {"corrupt", "selfish", "power", "lying", "lies", "media"}
Dim terms1string = Console.ReadLine()

Dim terms1 = keys1.Count(function(key) terms1string like "*" & key & "*")

If terms1 < 2 Then
    Console.WriteLine("juchu!")
Else
    Console.WriteLine("DuVersagst")
End If

Wenn Sie nur nach einzelnen Wörtern suchen möchten (foobar power lies sind 2 Treffer, foobarpowerlies sind 0 Treffer), können Sie stattdessen diese Zeile verwenden:

Dim terms1 = keys1.Count(function(key) terms1string.Split().Contains(key))

Zur Vollständigkeit hier noch eine Regex-Version:

' großzügiges Matching ('foobarpowerlies' => 2 Treffer)
Dim pattern = String.Join("|", keys1)
Dim terms1 = Regex.Matches(terms1string, pattern).Count

oder

' strenges Matching mit Wortgrenzen ('foobarpowerlies' => 0 Treffer, aber 'foobar power lies' => 2 Treffer)
Dim pattern = String.Join("|", keys1.Select(function(key) "\b" & key & "\b"))
Dim terms1 = Regex.Matches(terms1string, pattern).Count

2voto

Binary Worrier Punkte 49250

Sollte "Austin Powers" zu "power" passen und sollte "uncorrupt" zu "corrupt" passen? Unter der Annahme "nein"
Sollte "POWER" zu "power" passen? Unter der Annahme "ja"

Der sicherste Weg, dies zu tun, ist mit Regex

Function WordCount(keys() As String, terms As String) As Integer
    Dim pattern As String = "\b(" + Regex.Escape(keys(0))
    For Each key In keys.Skip(1)
        pattern += "|" + Regex.Escape(key)
    Next
    pattern += ")\b"

    Return Regex.Matches("terms", pattern, RegexOptions.IgnoreCase).Count
End Function

Sub Main()
    Dim keys1() As String = {"corrupt", "selfish", "power", "lying", "lies", "media"}
    Dim count As Integer
    count = WordCount(keys1, "lying son of a corrupt . . .") ' returns 2
    count = WordCount(keys1, "Never caught lying and uncorrupt . . .") ' returns 1
End Sub

Die Regex.Escape Funktion stellt sicher, dass alle Regex-spezifischen Zeichen in Ihren Schlüsseln maskiert werden und nicht als Regex-Befehle behandelt werden.

Die Option RegexOptions.IgnoreCase besagt, dass ein Fall-ignorantes Match durchgeführt wird.

Das \b ist eine Wortgrenze, daher muss vor und nach dem Match eine Wortgrenze (Leerzeichen, Interpunktion, Zeilenumbruch, Zeilenanfang, Zeilenende usw.) vorhanden sein.

Indem Sie die Schlüssel in diese Struktur (key1|key2|key3) setzen, wird angegeben, dass sie mit key1 oder key2 oder key3 übereinstimmen können

Hoffe das hilft

1voto

SSS Punkte 4453

Ich habe etwas für dich.

Das INSTR() deines Vaters. Dies ist die Waffe eines QuickBasic 4.5 Hackers. Nicht so tollpatschig oder zufällig wie ein Regex; eine elegante Waffe für eine zivilisiertere Zeit.

Module Module1

  Sub Main()
    Dim keys1() As String = {"korrupt", "egoistisch", "Macht", "Lügen", "Lügen", "Medien"}
    Dim terms1 As Integer = 0
    Dim terms1string As String = ""
    terms1string = Console.ReadLine()
    For Each st As String In keys1
      If InStr(terms1string, st) > 0 Then '<<

0voto

Jim O'Neil Punkte 23136

Vielleicht zu einfach, aber wenn Sie IndexOf verwenden, können Sie Ihre For-Schleife wie folgt ändern:

    If Not String.IsNullOrEmpty(terms1string) Then
        For Each st As String In keys1
            If terms1string.IndexOf(st) <> -1 Then
                terms1 = terms1 + 1

        Next

Es ist einfach, weil es die Eingabe nicht tokenisiert... daher werden Wörter wie "Korruption" und "täuscht" übereinstimmen. Wenn Sie genaue Übereinstimmungen benötigen, schauen Sie sich String.Split an, um die Eingabewörter zu erhalten, und dann gibt es eine Reihe von algorithmischen Optionen, um diese Liste mit Ihrer Liste von Schlüsseln zu vergleichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X