1

次のような文字列 (出現するたびに変更される) があります: <Left Mouse Up> <Right Mouse Up> <Press V><Press Up><Press Q><Press Up><Press L>単語の後の文字のすべてのインスタンスを読み取り、Pressそれらをリストに格納する必要がありますが、その方法がよくわかりません。文字列全体と、単語の後の文字のすべてのインスタンスを読み取るこのコードがありますが、Pressそれらをすぐにリストに保存するのではなく、反復後に保存します。

Dim keyString = command.ToString
    Dim allKeys As New List(Of String)
    Dim pattern = "Press "
    Dim index = keyString.IndexOf(pattern)
    While index >= 0
        index += pattern.Length
        Dim endIndex = keyString.IndexOf(">", index)
        If endIndex >= 0 Then
            Dim nextKey = keyString.Substring(index, endIndex - index)
            allKeys.Add(nextKey)
            index = keyString.IndexOf(pattern, endIndex + 1)

Pressしたがって、短いバージョンでは、文字列全体をスキャンし、文字の各インスタンスをリストに格納するようにするにはどうすればよいでしょうallKeysか?

4

4 に答える 4

3

正規表現 (RegEx) を使用すると、このタスクをより簡単に実行できます。正規表現に触れたことがない場合は、少し気が遠くなるかもしれませんが、おわかりのように、技術を学ぶために時間を割く価値はあります。正規表現は非常に強力で、この種の問題に最適です。

Dim keyString As String = "<Left Mouse Up> <Right Mouse Up> <Press V><Press Up><Press Q><Press Up><Press L>"
Dim regEx As New Regex("<Press (?<key>.*?)>")
Dim allKeys As New List(Of String)()
For Each m As Match In regEx.Matches(keyString)
    allKeys.Add(m.Groups("key").Value)
Next

この例で使用した正規表現は<Press (?<key>.*?)>. 式の各部分の意味は次のとおりです。

  • <Press- 一致する文字列は、これらの文字で始まる必要があります。
  • (?<key>- という名前の文字のグループを開始しkeyます。
  • .*- 任意の文字に何度でも一致します。
  • ?- 表現を非貪欲にします。つまり、任意の文字の任意の回数の一致には、>後で指定される最初の文字までのみが含まれます。疑問符がなければ、パターンは貪欲になり、最後の>文字まで文字列全体に一致します。
  • )- 名前付きグループを終了します。
  • >- 一致する文字列は、この文字で終わる必要があります。

簡単に言えば、正規表現は高度なワイルドカードを使用して検索パターンを定義します。*単純なワイルドカードとして使用する場合は、 のようになります<Press *>。言い換えると、 で始まり、<Pressで終わり>、その間に何かがある部分文字列のすべてのインスタンスを見つけたいと考えています。ただし、ワイルドカード部分がはるかに強力な正規表現パターンでは、ワイルドカードは単純な*文字ではなく、ワイルドカードは(?<key>.*?)任意の部分文字列に一致するように指示するだけでなく、名前keyをワイルドカード。名前を割り当てるということは、コードで簡単に参照してその値を取得できることを意味します。

コード例では、そのパターンを使用して正規表現オブジェクトを作成し、 をkeyString呼び出して変数の検索を実行しますregEx.Matches(keyString)。このメソッドは、Matchのパターンの各一致を表すオブジェクトのコレクションを返しますkeyString。次に、各一致からグループの値 (ワイルドカード部分)m.Groups("key").Valueを取得するために呼び出します。key

于 2013-07-09T12:48:08.067 に答える
1

これは、文字列を解析し、渡したリストを使用してリストに追加する単純なサブルーチンです。リストは、各項目が追加されるたびに更新されます。

Private Sub FillList(ByRef PressList As List(Of String), PressString As String)
    For Each token As String In PressString.Split({"Press"}, StringSplitOptions.None)
        If Not token.StartsWith("<") Then PressList.Add(token.Split(">"c)(0))
    Next
End Sub
于 2013-07-09T17:33:11.623 に答える
1

正規表現を使用できます。

Dim allKeys As New List(Of String)
Dim s As String = "<Left Mouse Up> <Right Mouse Up> <Press V><Press Up><Press Q><Press Up>   <Press L>"

Dim regx As Regex = New Regex("<(Press) ([\w+\s*]+)(>)")
Dim mcollection As MatchCollection = regx.Matches(s)
For Each m As Match In mcollection
    allKeys.Add(m.Groups(2).Value)
Next
于 2013-07-09T12:38:44.817 に答える