मैक एड्रेस के लिए एक नियमित अभिव्यक्ति क्या है?


125

इस प्रारूप में:

3D:F2:C9:A6:B3:4F

या:

3D-F2-C9-A6-B3-4F

जवाबों:


266

मानव-अनुकूल रूप में मैक -48 के पतों को मुद्रित करने के लिए मानक (IEEE 802) प्रारूप दो हेक्साडेसिमल अंकों के छह समूह हैं, जिन्हें हाइफ़न -या कॉलोन द्वारा अलग किया गया है :

इसलिए:

^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$

21
ध्यान दें कि यदि उन्हें निचले मामले हेक्साडेसिमल अक्षरों के साथ संग्रहित किया जा रहा है, तो यह दोनों मामलों को पकड़ने के लिए समूह को [0-9A-Fa-f] में नहीं बदलेगा
स्कॉट चैंबरलेन

5
आप शायद
कैसिंग

5
^ ([0-9A-Fa-f] {2} [: -]) {5} ((0-9A-Fa-f] {2}) $
राजावेल डी

2
एक तरफ, "मानक प्रारूप" से संबंधित उद्धरण विकिपीडिया से आता है, न कि 802.3 मानकों वाले निकाय से। आईईईई 802-2014 वास्तव में निर्दिष्ट करता हाइफ़न साधारण मैक पते (§ 8.1 ¶ 3) और के लिए कोलन अप्रचलित बिट उलट संकेतन (¶ 4) के लिए। महत्वपूर्ण रूप से, व्यवहार में, कोई भी इसका निरीक्षण नहीं करता है । हम बस एक या दूसरे का उपयोग करते हैं, लेकिन उन्हें कभी भी एक लिखित मैक में नहीं मिलाते हैं।
पायलट

1
मुझे नहीं लगता कि यह RegEx सही है क्योंकि यह एक मान्य मैक पते के रूप में '3D-F2-C9: A6-B3: 4F' को भी वर्गीकृत करता है, भले ही यह सही न हो। सही एक होगा: ((([a-zA-z0-9] {2} [-:]) {5} ([a-zA-z0-9] {2}) | (([a-] zA-z0-9] {2}:) {5} ((a-zA-z0-9] {2}))) ताकि हर बार जब आप पूरे मैक पते के लिए ':' या '-' चुन सकें।
PyFox

23

आंखों पर थोड़ा मुश्किल, लेकिन यह:

/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/

आपके मैक संकेतन के लिए सभी कॉलन या सभी डैश को लागू करेगा।

( A1:B2-C3:D4-E5:F6उदाहरण के लिए एक सरल रेगेक्स दृष्टिकोण की अनुमति हो सकती है , जो उपरोक्त अस्वीकार करता है।)


यह काम करता है, लेकिन क्या आप समझा सकते हैं: xdigit क्या है? और मैंने देखा कि आपने समूह ([-:]) को लंबाई के बाद रखा है, जो सभी कॉलोन या हाइफ़न लेता है?
Xaisoft

2
@Xaisoft, :xdigit:हेक्स अंक के लिए कम, कहने का एक और तरीका है [a-fA-F0-9]\1पहले पानी का छींटा या पेट के लिए कब्जा समूह को संदर्भित करता ([-:])है, और केवल मेल खाता है कि पहली बार क्या मिलान नहीं हुआ।
विमान चालक दल

2
+1 कैप्चरिंग और नॉन-कैप्चरिंग दोनों समूहों का उचित रूप से उपयोग करने के लिए, और उपयोग करने के लिए भी :xdigit:(भले ही "शॉर्टहैंड" केवल तुलना में छोटा हो [a-fA-F0-9]और समकक्ष /[a-f0-9]/iछोटा हो!)
gb96

@pilcrow क्या आप बता सकते हैं कि यह मैक क्यों C8:FD:19:55:E6:3Aविफल रहता है? यह एक वास्तविक मैक एड्रेस है। मैंने :केवल /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/धन्यवाद स्वीकार करने के लिए आपके regex को संशोधित किया है !
सैम

1
मेरे दिमाग में यह बेहतर जवाब है क्योंकि यह वास्तव में ":" और "-" के मिश्रित उपयोग की जांच करता है।
रे ओईई

9

यह रेगेक्स सिस्को प्रारूप जैसे मैक फॉर्म सहित हर मैक प्रारूप से काफी मेल खाता है 0102-0304-abcd

^([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}$

उदाहरण तार जो यह मेल खाता है:

01:02:03:04:ab:cd
01-02-03-04-ab-cd
01.02.03.04.ab.cd
0102-0304-abcd
01020304abcd

मिश्रित प्रारूप का भी मिलान किया जाएगा!


यह पहले पांच ऑक्टेट्स में से किसी के बाद विभाजकों से मेल खाएगा, जिसका अर्थ है कि यह स्वीकार करेगा aa.aa.bbbb.cccc, उदाहरण के लिए।
पायलट

1
#notAllFormats यदि आपके पास WiFi के साथ OSX सिस्टम तक पहुँच है, तो रन करें /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I, और BSSID लाइन की तलाश करें, यदि कोई %x%2x%02x printf
ऑक्टाट

8

सीमांकक: " : ", " - ", " "

डबल या सिंगल: 00 = 0, 0f = f

/^([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})$/i

या

/^([0-9a-F]{1,2}[\.:-]){5}([0-9a-F]{1,2})$/


exm: 00:27:0e:2a:b9:aa, 00-27-0E-2A-B9-AA, 0.27.e.2a.b9.aa ...

2
दूसरा गलत तरीके से तार से मेल खाएगा जिसमें गैर-हेक्स वर्ण जैसे कि जी।
बाइनरी फ़िले

BRE / ERE को छोड़कर दूसरा फ्लेवर अधिकांश फ्लेवर्स में मान्य नहीं है, जो वर्ण श्रेणी के टकराव का समर्थन करता है। हालांकि, वर्ण श्रेणी के टकराव के लिए समर्थन कार्यान्वयन के बीच भिन्न होता है, इसलिए परिणाम भिन्न हो सकता है।
न्हादत्त

एक और बात यह है कि समूहों के पास 2 हेक्सा-अंक होने चाहिए।
नाहदथ

सिद्धांत रूप में जंगली में कार्यक्रमों द्वारा लौटे सभी मैक पते कुछ मानक का पालन करेंगे जैसे प्रत्येक अलग समूह में 2 हेक्स अंक। हालांकि, कुछ गैर-मानकीकृत यूनिक्स वेरिएंट आउटपुट को छोटा करते हैं जब एक अग्रणी शून्य होता है, जिससे कुछ मामलों में केवल 1 हेक्स चर होता है। इसलिए {1,2}रेगेक्स की आवश्यकता
ट्रिनिट्रोनएक्स

हालांकि, से निर्धारित चरित्र [0-9a-F]को संभवतः फिर से लिखा जाना चाहिए:[0-9a-fA-F]
ट्रिनिट्रोनएक्स

5

चेतावनी दी है कि यूनिकोड संपत्ति \p{xdigit}में FULLWIDTH संस्करण शामिल हैं। आप \p{ASCII_Hex_Digit}इसके बजाय पसंद कर सकते हैं ।

पूछे गए प्रश्न का उत्तर सबसे अच्छा हो सकता है - बशर्ते आपके पास एक निश्चित आदरणीय सीपीएएन मॉड्यूल स्थापित हो - टाइप करके:

% perl -MRegexp::Common -lE 'say $RE{net}{MAC}'

मैं विशेष पैटर्न दिखाता हूं जो यहां आउटपुट करता है भाग्यशाली पैटर्न नंबर 13 के रूप में करता है; कई अन्य हैं।

यह कार्यक्रम:

#!/usr/bin/env perl
use 5.010;
use strict;
use warnings qw<FATAL all>;

my $mac_rx = qr{
    ^ (?&MAC_addr) $
    (?(DEFINE)
        (?<MAC_addr>
                (?&pair) (?<it>  (?&either) )
            (?: (?&pair) \k<it> ) {4}
                (?&pair)
        )
        (?<pair>    [0-9a-f] {2} )
        (?<either>  [:\-]        )
    )
}xi;

while (<DATA>) {
    chomp;
    printf("%-25s %s\n", $_ => /$mac_rx/ ? "ok" : "not ok");
}

__END__
3D:F2:C9:A6:B3:4F
3D:F2:AC9:A6:B3:4F
3D:F2:C9:A6:B3:4F:00
:F2:C9:A6:B3:4F
F2:C9:A6:B3:4F
3d:f2:c9:a6:b3:4f
3D-F2-C9-A6-B3-4F
3D-F2:C9-A6:B3-4F

यह उत्पादन उत्पन्न करता है:

3D:F2:C9:A6:B3:4F         ok
3D:F2:AC9:A6:B3:4F        not ok
3D:F2:C9:A6:B3:4F:00      not ok
:F2:C9:A6:B3:4F           not ok
F2:C9:A6:B3:4F            not ok
3d:f2:c9:a6:b3:4f         ok
3D-F2-C9-A6-B3-4F         ok
3D-F2:C9-A6:B3-4F         not ok

ऐसा लगता है कि आप जिस चीज की तलाश कर रहे हैं।



4

इस प्रश्न को भी देखें ।

इस प्रकार के रूप में Regexes:

^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$

^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$

1
क्या समूह बनाकर इसे छोटा करने का कोई तरीका नहीं है? और मैं रेगेक्स को 2 अलग नियमित अभिव्यक्तियों के बिना या तो a: या - a कैसे जोड़ सकता हूं?
Xaisoft

छोटा रूप जो नेटकोडर प्रदान करता है वह भी काम करेगा। एक या दूसरे का उपयोग करना इस बात पर आधारित हो सकता है कि क्या आपको किसी मैक पते पर कब्जा करने की आवश्यकता है या केवल इसे पूरे पर मान्य करें।
ज्येल्टन

इसे पूरे पर मान्य करने की आवश्यकता है, इसलिए यदि इसमें या तो सभी हाइफ़न या सभी कॉलोन शामिल हैं। यदि इसमें मिश्रण होता है, तो यह एक मान्य मैक नहीं है।
Xaisoft

2
@Xaisoft: जैसा कि मैंने अपने उत्तर की टिप्पणी में कहा, कॉलोन और हाइफ़न को मिलाना विनिर्देश के अनुसार वैध है।
नेटकोडर

आप किस स्रोत से मैक पते प्राप्त कर रहे हैं, इसमें सीमांकक का मिश्रण हो सकता है? यदि वे एक वास्तविक मशीन / एनआईसी से आ रहे हैं, तो संभवतः आपके पास यह मुद्दा नहीं होगा। यदि यह उपयोगकर्ता द्वारा दर्ज किया गया डेटा है, तो बस सभी सीमांकक को सुसंगत बनाने के लिए एक स्ट्रिंग बदलें।
येल्टन

2
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/

क्या यह पायलट के जवाब के समान है, बस बिना: xdigit?
Xaisoft


2
/^(([a-fA-F0-9]{2}-){5}[a-fA-F0-9]{2}|([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}|([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})?$/

ऊपर का रेक्सक्स नीचे दिए गए सभी मैक पतों को मान्य करता है:

01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab

मुझे लगता है कि यह एकमात्र ऐसा है जो पूर्ण और सही है।
विन्सेन्ट सेल्स


1

मुझे नहीं लगता कि मुख्य RegEx सही है क्योंकि यह भी वर्गीकृत करता है

'3D-F2-C9:A6-B3:4F' 

एक मान्य मैक पते के रूप में, भले ही यह सही न हो। सही एक होगा:

((([a-zA-z0-9]{2}[-:]){5}([a-zA-z0-9]{2}))|(([a-zA-z0-9]{2}:){5}([a-zA-z0-9]{2})))

ताकि हर बार जब आप पूरे मैक पते के लिए ':' या '-' चुन सकें।


0

आप सत्यापन के लिए मैक पते को पारित करके निम्नलिखित प्रक्रिया का उपयोग कर सकते हैं,

private static final String MAC_PATTERN = "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$";

private boolean validateMAC(final String mac){          
    Pattern pattern = Pattern.compile(MAC_PATTERN);
    Matcher matcher = pattern.matcher(mac);
    return matcher.matches();             
}


0

यदि आपको इस संस्करण की तरह, संख्याओं के बीच रिक्त स्थान की आवश्यकता है

3D : F2 : C9 : A6 : B3 : 4F

रेगेक्स बदल जाता है

"^([0-9A-Fa-f]{2}\\s[:-]\\s){5}([0-9A-Fa-f]{2})$"

0

दोनों 48-बिट EUI-48 और 64-बिट EUI-64 मैक पते से मेल खाने के लिए:

/\A\h{2}([:\-]?\h{2}){5}\z|\A\h{2}([:\-]?\h{2}){7}\z/

जहाँ \ h एक चरित्र है [0-9a-fA-F]

या:

/\A[0-9a-fA-F]{2}([:\-]?[0-9a-fA-F]{2}){5}\z|\A[0-9a-fA-F]{2}([:\-]?[0-9a-fA-F]{2}){7}\z/

यह '-' या ':' या किसी विभाजक का उपयोग करने की अनुमति नहीं देता है


0

शायद सबसे कम संभव:

/([\da-f]{2}[:-]){5}[\da-f]{2}/i

अद्यतन : PHP में मैक पतों को मान्य करने के लिए एक बेहतर तरीका मौजूद है जो हाइफ़न-स्टाइल और कोलोन-स्टाइल मैक पते दोनों के लिए समर्थन करता है। फ़िल्टर_वर () का उपयोग करें :

// Returns $macAddress, if it's a valid MAC address
filter_var($macAddress, FILTER_VALIDATE_MAC);

जैसा कि मुझे पता है, यह इन रूपों में मैक पते का समर्थन करता है (x: एक हेक्साडेसिमल संख्या):

xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx

0

करने के लिए बहुत बहुत धन्यवाद @Moshe के लिए महान जवाब ऊपर। कुछ और शोध करने के बाद मैं अपने अतिरिक्त निष्कर्षों को जोड़ना चाहूंगा, दोनों IEEE 802 के संबंध में और रेक्स में सुसंगत विभाजक उपयोग को लागू करने के लिए।

मानव-अनुकूल रूप में मैक -48 पतों को मुद्रित करने के लिए मानक (IEEE 802) प्रारूप दो हेक्साडेसिमल अंकों के छह समूहों है, जिन्हें हाइफ़न द्वारा अलग किया गया है - । हालाँकि, व्यापक रूप से अपनाया गया अधिवेशन भी बृहदान्त्र को अनुमति देता है: और चार हेक्साडेसिमल अंकों के तीन समूहों को अवधि द्वारा अलग किया गया

अपने प्रारंभिक बयान के लिए यहाँ @Moshe को पूरा श्रेय , और @pilcrow को इंगित करने के लिए कि IEEE 802 केवल हाइपेंस को कवर करता है।

यहाँ एक रेगेक्स है जो लागू करता है कि पूरे मैक पते पर एक ही विभाजक का उपयोग किया जाता है:

^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$

Regex101 डेमो

और यहाँ एक अतिरिक्त है जो बिना किसी विभाजक के उपयोग की अनुमति देता है:

^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$

Regex101 डेमो


0

मैक पते के रूप में 6 या 20 बाइट्स (infiniband, ...) सही उत्तर हो सकता है:

^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$

आप बदल सकते हैं: [: -] के साथ यदि आप अलग विभाजक चाहते हैं या कोई नहीं।


-1

यह एक छोटा है:

(([0-9A-F]{2}[:-]?){6})

ध्यान रखें, कई आकर्षण या विभाजक का अजीब मिश्रण पास हो सकता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.