Регулярное выражение для работы на разных локалях - PullRequest
1 голос
/ 09 сентября 2011

Я использую команду ipconfig/all и регулярное выражение в Java, чтобы узнать MAC-адрес.

Я ищу Physical Address в выводе команды ipconfig/all.

Но проблема в том, что я хочу, чтобы регулярное выражение работало в другой локали, то есть он может найти физический адрес для любой локали.

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 09 сентября 2011

обратите внимание, что для некоторых компьютеров, специально предназначенных для HP / Compaq, MAC-адрес должен быть доступен с

Process pcs = Runtime.getRuntime().exec("wmic bios"); 

если настроен BIOS (Largiest Company), то эти данные должны быть доступны с помощью JNI / JNA (множество сценариев VB / C #)

пример:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

public class MAC_TEST {

    private static Pattern macPattern = Pattern.compile("[0-9a-fA-F]{2}[-:][0-9a-fA-F]{2}[-:]"
            + "[0-9a-fA-F]{2}[-:][0-9a-fA-F]{2}[-:][0 -9a-fA-F]{2}[-:][0-9a-fA-F]{2}");

    private static List getWindowsMACAddresses() {
        try {
            //Process conf = Runtime.getRuntime().exec("wmic bios");//for HP computers
            Process conf = Runtime.getRuntime().exec("ipconfig /all");
            //Process p = Runtime.getRuntime().exec("wmic bios /all");
            BufferedReader input = new BufferedReader(
                    new InputStreamReader(conf.getInputStream()));
            return getMACAddresses(input);
        } catch (Exception e) {
            System.err.println("Error Reading Windows MAC Address.");
        }
        return new ArrayList(1);
    }

    private static List getLinuxMACAddresses() {
        try {
            Process conf = Runtime.getRuntime().exec("/sbin/ifconfig");
            BufferedReader input = new BufferedReader(
                    new InputStreamReader(conf.getInputStream()));
            return getMACAddresses(input);
        } catch (Exception e) {
            System.err.println("Error Reading Linux MAC Address.");
        }
        return new ArrayList(1);
    }

    private static List getHPUXMACAddresses() {
        try {
            Process conf = Runtime.getRuntime().exec("/etc/lanscan");
            BufferedReader input = new BufferedReader(
                    new InputStreamReader(conf.getInputStream()));
            return getMACAddresses(input);
        } catch (Exception e) {
            System.err.println("Error Reading HPUX MAC Address.");
        }
        return new ArrayList(1);
    }

    private static List getSolarisMACAddresses() {
        try {
            List rtc = new ArrayList(1);
            Process conf = Runtime.getRuntime().exec("/usr/sbin/arp "
                    + InetAddress.getLocalHost().getHostAddress());
            BufferedReader input = new BufferedReader(
                    new InputStreamReader(conf.getInputStream()));
            rtc.addAll(getMACAddresses(input));
            input.close();
            input = null;
            conf = null;
            //Solaris reports MAC address without first 0, change the pattern at re-test
            macPattern = Pattern.compile("[0-9a-fA-F][-:][0-9a-fA-F]{2}[-:][0-9a-fA-F]{2}"
                    + "[-:][0-9a-fA-F]{2}[-:][0 -9a-fA-F]{2}[-:][0-9a-fA-F]{2}");
            conf = Runtime.getRuntime().exec("/usr/sbin/arp "
                    + InetAddress.getLocalHost().getHostAddress());
            input = new BufferedReader(new InputStreamReader(
                    conf.getInputStream()));
            rtc.addAll(getMACAddresses(input));
            //Revert pattern
            macPattern = Pattern.compile("[0-9a-fA-F]{2}[-:][0-9a-fA-F]{2}[-:][0-9a-fA-F]{2}"
                    + "[-:][0-9a-fA-F]{2}[-:][0 -9a-fA-F]{2}[-:][0-9a-fA-F]{2}");
            return rtc;
        } catch (Exception e) {
            System.err.println("Error Reading Solaris MAC Address.");
        }
        return new ArrayList(1);
    }

    private static List getMACAddresses(BufferedReader input) throws Exception {
        List MACs = new ArrayList(1);
        String theLine;
        while ((theLine = input.readLine()) != null) {
            String[] ss = macPattern.split(theLine);
            for (int p = 0; p < ss.length; p++) {
                String s = theLine.substring(theLine.indexOf(ss[p]) + ss[p].length()).trim();
                if (!s.isEmpty()) {
                    String s1 = s.replaceAll("-", ":");
                    String s2 = s1.substring(0, s1.lastIndexOf(':') + 3);
                    if (s2.length() == 16 || s2.length() == 17) {
                        MACs.add(s2);
                    }
                }
            }
        }
        return MACs;
    }

    public static void main(String[] args) {
        try {
            System.out.println("WINDOWS ... Found the following MAC Addresses: ");
            List MACS = getWindowsMACAddresses();
            System.out.println("*-----------------*");
            for (int i = 0; i < MACS.size(); i++) {
                System.out.println("|" + MACS.get(i) + "|");
            }
            System.out.println("*-----------------*");
            System.out.println(" ");
            System.out.println("Linux ...  Found the following MAC Addresses: ");
            MACS = getLinuxMACAddresses();
            System.out.println("*-----------------*");
            for (int i = 0; i < MACS.size(); i++) {
                System.out.println("|" + MACS.get(i) + "|");
            }
            System.out.println("*-----------------*");
            System.out.println(" ");
            System.out.println("Solaris ...  Found the following MAC Addresses: ");
            MACS = getSolarisMACAddresses();
            System.out.println("*-----------------*");
            for (int i = 0; i < MACS.size(); i++) {
                System.out.println("|" + MACS.get(i) + "|");
            }
            System.out.println("*-----------------*");
            System.out.println(" ");
            System.out.println("HPUX ...  Found the following MAC Addresses: ");
            MACS = getHPUXMACAddresses();
            System.out.println("*-----------------*");
            for (int i = 0; i < MACS.size(); i++) {
                System.out.println("|" + MACS.get(i) + "|");
            }
            System.out.println("*-----------------*");
            System.out.println(" ");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private MAC_TEST() {
    }
}
1 голос
/ 09 сентября 2011

Вместо того, чтобы искать «Физический адрес» или любую другую локализованную версию (которая будет требовать добавления локализованной версии каждый раз, когда вам потребуется поддержка нового языка), вы можете написать только одно регулярное выражение, чтобы найти MACсам адрес.

Поскольку мы знаем, что типичные MAC-адреса состоят из шести групп по две шестнадцатеричных цифры в каждой, разделенных двоеточиями, точками или тире, следующее регулярное выражение выполнит это:

([a-fA-F0-9]{2}[:\-\.]){5}[a-fA-F0-9]{2}

Объяснение: (две шестнадцатеричные цифры, за которыми следует двоеточие:, повторяется 5 раз) (последние две шестнадцатеричные цифры)

1 голос
/ 09 сентября 2011

Вот что я получаю, когда запускаю ipconfig /all:

Adaptér sítě Ethernet Připojení k místní síti:
        Přípona DNS podle připojení . . . : example.com
        Popis . . . . . . . . . . . . . . : AMD PCNET Family PCI Ethernet Adapter
        Fyzická Adresa. . . . . . . . . . : DE-AD-BE-EF-CA-FE
        Protokol DHCP povolen . . . . . . : Ano
        Automatická konfigurace povolena  : Ano
        Adresa IP . . . . . . . . . . . . : 192.168.0.158
        Maska podsítě . . . . . . . . . . : 255.255.255.0
        Výchozí brána . . . . . . . . . . : 192.168.0.1
        Server DHCP . . . . . . . . . . . : 192.168.0.1
        Servery DNS . . . . . . . . . . . : 192.168.0.1
        Primární server WINS. . . . . . . : 192.168.0.1
        Zapůjčeno . . . . . . . . . . . . : 9. září 2011 16:05:32
        Zápůjčka vyprší . . . . . . . . . : 9. září 2011 20:05:32

Как видите, искать строку «Физический адрес» несколько бесполезно, поскольку ее нет.Однако обратите внимание, что в Windows есть свой собственный формат для MAC-адресов - разделяя каждые две шестнадцатеричные цифры дефисом (и заглавными буквами алфавитных частей).Итак, поиск выражения:

([0-9A-F]{2}-){5}[0-9A-F]{2}

даст вам MAC-адрес, который вы ищете.

Предупреждение: многие компьютеры имеют более одного сетевого интерфейса (проводной и Wi-Fi, различныеVPN и т. Д.), Поэтому в выходных данных может быть несколько MAC-адресов.

1 голос
/ 09 сентября 2011

ВАРИАНТ 1:

Вы можете использовать регулярное выражение наподобие этого (АНГЛИЙСКИЙ, ФРАНЦУЗСКИЙ, ИСПАНСКИЙ):

/(Physical Address|Adresse Physique|Direccion fisica)/

Позже проверьте, какую локаль вы используете, иобновите ваше регулярное выражение.

ВАРИАНТ 2:

Используйте Java (JDK 1.6) напрямую, чтобы получить MAC-адрес

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;

public class MacAddress {

public static void main(String[] args) {
    try {
        //InetAddress address = InetAddress.getLocalHost();
        InetAddress address = InetAddress.getByName("192.168.0.158");

        /*
         * Get NetworkInterface for the current host and then read the
         * hardware address.
         */
        NetworkInterface ni = NetworkInterface.getByInetAddress(address);
        if (ni != null) {
            byte[] mac = ni.getHardwareAddress();
            if (mac != null) {
                /*
                 * Extract each array of mac address and convert it to hexa with the
                 * following format 08-00-27-DC-4A-9E.
                 */
                for (int i = 0; i < mac.length; i++) {
                    System.out.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "");
                }
            } else {
                System.out.println("Address doesn't exist or is not accessible.");
            }
        } else {
            System.out.println("Network Interface for the specified address is not found.");
        }
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (SocketException e) {
        e.printStackTrace();
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...