2
    Dim keys1() As String = {"corrupt", "selfish", "power", "lying", "lies", "media"}
    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("yay!")
    Else
        Console.WriteLine("YouFail")
    End If

私のコードがあります。入力した文字列にこれらの用語が2つ以上含まれている場合は、「Yay」と表示されます。それ以外の場合は、「YouFail」と表示されます。

---更新8/29/12---

    Function StageTwo(ByVal fname, ByVal lname, ByVal city)
    Console.WriteLine("Describe the U.S. Government.")
    Dim overall As Integer = 0
    Dim keys1() As String = {"corrupt", "selfish", "power", "lying", "lies", "media"}
    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 '<<<this line right here!
            terms1 = terms1 + 1
        End If
    Next
    If terms1 < 0 Then
        Console.WriteLine("yay!")
        overall = overall + 1
    End If
    Console.WriteLine()
    Console.WriteLine("Describe the economic status in the U.S.")
    Dim keys2() As String = {"broken", "backed", "failed", "skewed", "tilted", "99%", "rigged", "unfair"}
    Dim terms2 As Integer = 0
    Dim terms2string As String = ""
    terms2string = Console.ReadLine()
    For Each st As String In keys2
        If InStr(terms2string, st) > 0 Then '<<<this line right here!
            terms2 = terms2 + 1
        End If
    Next
    If terms2 < 0 Then
        Console.WriteLine("yay!")
        overall = overall + 1
    End If
    If overall = 2 Then
        Console.WriteLine()
        Console.WriteLine("Enter a username.")
        Dim username As String = ""
        username = Console.ReadLine()
        Console.WriteLine("Please wait.")
        IsURLValid(username, overall)
    Else
        Console.WriteLine("Test Failed.")
    End If
    System.Threading.Thread.Sleep(2000)
End Function

それが私の新しいコードです。まだ機能していませんが、最初のテストで破損し、2番目のテストで破損した後、印刷テストが失敗しました。もう一度助けますか?どうもありがとう。

4

4 に答える 4

2

"Austin Powers" は "power" と一致し、"uncorrupt" は "corrupt" と一致する必要がありますか? 「いいえ」と仮定すると、「
POWER」は「power」と一致する必要がありますか? 「はい」と仮定して

これを行う最も安全な方法は、正規表現を使用することです

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

このRegex.Escape関数は、キー内の正規表現固有の文字がエスケープされ、正規表現コマンドとして扱われないことを保証します。

このRegexOptions.IgnoreCaseオプションは、大文字と小文字を区別しない一致を行うように指示します。

\b単語境界であるため、一致の前後に単語境界 (スペース、句読点、改行、文字列の開始、文字列の終了など) が必要です。

この構造にキーを配置すると、またはまたは(key1|key2|key3)に一致する可能性があることがわかりますkey1 key2 key3

お役に立てれば

于 2012-08-29T07:46:53.753 に答える
2

なぜそんなに複雑なのですか?使用するだけ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("yay!")
Else
    Console.WriteLine("YouFail")
End If

単一の単語に一致させたい場合 ( foobar power liesare 2 一致、foobarpowerliesare 0 一致)、代わりに次の行を使用できます。

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

完全を期すために、正規表現バージョンを次に示します。

' generous match ('foobarpowerlies' => 2 matches)
Dim pattern = String.Join("|", keys1)
Dim terms1 = Regex.Matches(terms1string, pattern).Count

また

' strict match using word boundaries ('foobarpowerlies' => 0 matches, but 'foobar power lies' => 2 matches)
Dim pattern = String.Join("|", keys1.Select(function(key) "\b" & key & "\b"))
Dim terms1 = Regex.Matches(terms1string, pattern).Count
于 2012-08-29T07:06:29.767 に答える
1

あなたにあげたいものがあるんだ。

あなたのお父さんの INSTR()。これは、QuickBasic 4.5 ハッカーの武器です。正規表現ほど不器用でもランダムでもありません。より文明化された時代のためのエレガントな武器。

Module Module1

  Sub Main()
    Dim keys1() As String = {"corrupt", "selfish", "power", "lying", "lies", "media"}
    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 '<<<this line right here!
        terms1 = terms1 + 1
      End If
    Next st
    If terms1 < 2 Then
      Console.WriteLine("yay!")
    Else
      Console.WriteLine("YouFail")
    End If
    Console.ReadKey()

  End Sub

End Module
于 2012-08-29T06:34:56.453 に答える
0

単純すぎるかもしれませんが、IndexOfを使用すると、 For ループを次のように変更できます。

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

入力をトークン化しないという点で単純化されています...そのため、「腐敗」や「嘘」などの単語が一致を登録します。完全一致が必要な場合は、String.Splitを調べて入力単語を取得します。次に、そのリストをキーのリストと比較するアルゴリズム オプションがいくつかあります。

于 2012-08-29T05:22:49.640 に答える