1

サラウンド WiFi ネットワークをスキャンし、SSID と暗号化タイプを含む配列に情報をダンプするプログラムを作成しようとしています。次に、SSID 動的配列を静的配列と比較して、SSID を一致させようとし、結果を出力します。

正規表現を使用して SSID と暗号化だけを入れて動的配列を作成しようとすると問題が発生します。ネットワーク ダンプの出力は次のようになります。

Interface name : Wireless Network Connection 
There are 8 networks currently visible. 

SSID 1 : TheChinaClub-5G
    Network type            : Infrastructure
    Authentication          : WPA2-Personal
    Encryption              : CCMP 

次の番号をワイルドカードとしてキーとしてSSIDを使用しようとしました(ただし、構文はわかりません)。スペースを除いたコロンの後のデータを取得します。現在のところ、ネットワーク ダンプ以外は何も機能しません。正規表現は何も見つけていないようです。私はこの投稿を正規表現のモデルに使用してきました。

これまでのコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;

namespace Rainbownetworks
{
    public struct Networkarr
    {
        public string x, y;

        public Networkarr(string SSID, string Encryption)
        {
            x = SSID;
            y = Encryption;
        }
    }

     class Program
    {

        static void Main(string[] args)
        {
            string[] StaticSSIDarr = { "network1", "network2", "network3" };
            string[] Networkarr = { };


            Process p = new Process();
            p.StartInfo.FileName = "netsh.exe";
            p.StartInfo.Arguments = "wlan show networks";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.Start();
            string results = p.StandardOutput.ReadToEnd();

            string[] SSIDs = { "SSID *"};

            FindSSIDs(SSIDs, results);

            Console.WriteLine(results);
            Console.ReadLine();




        }

        private static void FindSSIDs(IEnumerable<string> keywords, string source)
        {
            var found = new Dictionary<string, string>(10);
            var keys = string.Join("|", keywords.ToArray());
            var matches = Regex.Matches(source, @"(?<key>" + keys + "):",
                                  RegexOptions.IgnoreCase);

            foreach (Match m in matches)
            {
                var key = m.Groups["key"].ToString();
                var start = m.Index + m.Length;
                var nx = m.NextMatch();
                var end = (nx.Success ? nx.Index : source.Length);
                found.Add(key, source.Substring(start, end - start));
            }

            foreach (var n in found)
            {
                Networkarr newnetwork = new Networkarr(n.Key, n.Value);
                Console.WriteLine("Key={0}, Value={1}", n.Key, n.Value);
            }
        }
    }


}
4

1 に答える 1

2

これを試して

try {
    Regex regexObj = new Regex(@"(?<=SSID\s*\d+ :\s*)(?<value>\S+)");
    Match matchResults = regexObj.Match(subjectString);
    while (matchResults.Success) {
        for (int i = 1; i < matchResults.Groups.Count; i++) {
            Group groupObj = matchResults.Groups[i];
            if (groupObj.Success) {
                // matched text: groupObj.Value
                // match start: groupObj.Index
                // match length: groupObj.Length
            } 
        }
        matchResults = matchResults.NextMatch();
    } 
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

説明

@"
(?<=         # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind)
   SSID         # Match the characters “SSID” literally
   \s           # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks)
      *            # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   \d           # Match a single digit 0..9
      +            # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
   \ :          # Match the characters “ :” literally
   \s           # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks)
      *            # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
)
(?<value>    # Match the regular expression below and capture its match into backreference with name “value”
   \S           # Match a single character that is a “non-whitespace character”
      +            # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
"

お役に立てれば。

于 2012-05-26T15:00:52.240 に答える