1

I am trying to write a program that scans the surround WiFi networks and dumps the info into an array containing the SSID and Encryption type. The SSID dynamic array would then be compared with a static array trying to match SSIDs together then outputing results.

I am having trouble trying create the dynamic array putting just the SSID and Encryption in using Regex. The output of the Network dump looks like this:

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

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

I've tried to use SSID as the key with the following number as a wildcard (but don't know the syntax) and grab the data after the colon excluding the space. As of right now nothing works except for the network dump. The regex doesn't seem to be finding anything. I've been using this post for the model of the regex.

Here is the code I have thus far:

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);
            }
        }
    }


}
Community
  • 1
  • 1
Nick
  • 9,285
  • 33
  • 104
  • 147

1 Answers1

2

Try this

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
}

Explanation

@"
(?<=         # 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)
)
"

Hope this helps.

Cylian
  • 10,970
  • 4
  • 42
  • 55
  • This works great the only problem is that if the SSID has a space in it the string only shows the first word of the network. – Nick May 26 '12 at 16:06