2016-01-14 8 views
5

की सामग्री मैं पाइथन से node.js. में निम्नलिखित को बदलने की कोशिश कर रहा हूं।एक RegExp मैच

var localIp = new RegExp(/(^127\.0\.0\.1)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)/); 
console.log('192.168.0.1'.match(localIp)); 
console.log('8.8.8.8'.match(localIp)); 
console.log('109.231.231.221'.match(localIp)); 

कौन मेरा पीछा उत्पादन देता है:

import re 

def is_private_ip(ip): 
    """ 
    Returns `True` if the `ip` parameter is a private network address. 
    """ 
    c = re.compile('(^127\.0\.0\.1)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)') 
    if c.match(ip): return True 
    return False 

print is_private_ip('192.168.0.1') # True 
print is_private_ip('8.8.8.8') # False 
print is_private_ip('109.231.231.221') # False 

मैं इस तरह जावास्क्रिप्ट में इसे लागू किया: यह एक बस प्रोग्राम एक आईपी पता सार्वजनिक या निजी है अगर जाँच करने के लिए regex का उपयोग करता है है

[ '192.168.', 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    '192.168.', 
    index: 0, 
    input: '192.168.0.1' ] 
null 
null 

ऐसा लगता है जैसे यह काम करता है (यहां तक ​​कि टीबी भी नहीं)। दो आईपी जो सार्वजनिक होनी चाहिए null लौट रहे हैं, इसलिए मुझे लगता है कि यह सही है। हालांकि मैं दूसरे मैच के आउटपुट को समझ नहीं पा रहा हूं? मैं यह समझने में सक्षम नहीं हूं कि इसका अर्थ क्या है

+2

.match() आपको अपने स्ट्रिंग में संभव मैचों की संख्या देता है। शायद आप जो खोज रहे हैं वह है .test() विधि। – Shivi

उत्तर

1
var localIp = new RegExp(/(^127\.0\.0\.1)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)/); 

console.log ('192.168.0.1'.match (localIp)) ;

[ '192.168.', 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    '192.168.'] 

इसका मतलब है कि:

  • '192.168.' इस स्ट्रिंग पर regex का मुकाबला नहीं है कि

    आप उत्पादन देता है। (^10\.)

  • undefined समूह के लिए: (^172\.1[6-9]\.)
  • समूह के लिए undefined: (^172\.2[0-9]\.)
  • undefined(^127\.0\.0\.1)
  • समूह के लिए undefined: केवल एक
  • undefined अपने regex में पहले समूह के लिए मैच है समूह के लिए: (^172\.3[0-1]\.)
  • '192.168.' समूह के लिए: (^192\.168\.)

संश्लेषण की वजह से, उनमें से प्रत्येक एक मैच (या अपरिभाषित) दे रहा है, साथ ही यह मैच match() फ़ंक्शन देता है।

1

.match() आपको अपने स्ट्रिंग में संभव मैचों की संख्या देता है। शायद आप जो खोज रहे हैं वह है .test() विधि।

var localIp = new RegExp(/(^127\.0\.0\.1)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)/); 
console.log(localIp.test('192.168.0.1')); 
console.log(localIp.test('8.8.8.8')); 
console.log(localIp.test('109.231.231.221')); 

आप यहाँ मैच विधि के बारे में अधिक जानकारी के लिए उल्लेख कर सकते हैं: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/match

1

String.prototype.match():

नियमित अभिव्यक्ति करता है

आप इस तरह कोड संशोधित करना होगा जी ध्वज शामिल नहीं है, RegExp.exec() के समान परिणाम देता है। लौटाए गए ऐरे में एक अतिरिक्त इनपुट प्रॉपर्टी होती है, जिसमें मूल स्ट्रिंग होती है जिसे पार्स किया गया था। इसके अतिरिक्त, इसमें एक इंडेक्स प्रॉपर्टी है, जो स्ट्रिंग में मिलान के शून्य-आधारित इंडेक्स का प्रतिनिधित्व करती है।

RegExp.prototype.exec():

लौटे सरणी प्रत्येक कब्जा कोष्ठक है कि पाठ कि कब्जा कर लिया था युक्त मिलान किया के लिए पहला आइटम के रूप में मिलान वाला पाठ, और फिर एक आइटम है।

यदि मैच विफल रहता है, तो exec() विधि शून्य हो जाती है।

हो सकता है कि आप के बजाय RegExp.prototype.test() उपयोग करना चाहते हैं:

var localIp = new RegExp(/(^127\.0\.0\.1)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)/); 
console.log(localIp.test('192.168.0.1'));  // => true 
console.log(localIp.test('8.8.8.8'));   // => false 
console.log(localIp.test('109.231.231.221')); // => false 
1

आप String.prototype.match -method उपयोग कर रहे हैं। प्रलेखन के अनुसार, यह "Array" मिलान किए गए परिणाम या null देता है यदि कोई मिलान नहीं होता है। "

जावास्क्रिप्ट में, Array सत्य है और null गलत है। इसका मतलब है कि निम्नलिखित की जांच वास्तव में सही ढंग से करता है, तो एक स्ट्रिंग एक स्थानीय आईपी है का परीक्षण होगा:

if(someIpString.match(localIp)) { 
    // it is a local IP 
} 
else { 
    // it is not a local IP 
} 

क्या आप सरणी में देख रहे हैं मूल स्ट्रिंग है जो नियमित अभिव्यक्ति में मिलान समूहों द्वारा मिलान किया गया के विभिन्न भागों है । null मान उन समूहों के लिए मेल हैं जो मौजूद नहीं हैं, जिनके पास आपके पास बहुत कुछ है।

लेकिन मुझे लगता है कि आप एक कदम आगे जा सकते हैं।यदि आप बस यह जांचना चाहते हैं कि कोई स्ट्रिंग नियमित अभिव्यक्ति से मेल खाती है, तो मैं RegExp.prototype.test की अनुशंसा करता हूं। इस विधि एक बूलियन (true|false) देता है, ताकि आप truthy- या falsy सत्ता पर भरोसा करने की जरूरत नहीं है:

if(localIp.test(someIpString)) { 
    // it is a local IP 
} 
else { 
    // it is not a local IP 
} 
1

आपको मिलान समूहों का उपयोग करने की आवश्यकता नहीं है, जब तक आप आईपी पते के मिलान भाग को कैप्चर नहीं करना चाहते हैं, लेकिन यह आपके मामले में आवश्यक नहीं है। जावास्क्रिप्ट में आप इस regex पैटर्न (ध्यान दें कोई मुकाबला समूहों) का उपयोग कर सकते हैं:

var localIp = new RegExp(/^127\.0\.0\.1|^10\.|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-1]\.|^192\.168\./); 

और फिर इस तरह इसका इस्तेमाल:

console.log('192.168.0.1'.match(localIp) != null); 
console.log('8.8.8.8'.match(localIp) != null); 
console.log('109.231.231.221'.match(localIp) != null); 

या, और भी बेहतर, RegEx.test() का उपयोग करें:

console.log(localIp.test('192.168.0.1')); 

इसी प्रकार पायथन के लिए, मिलान समूहों की आवश्यकता नहीं है।

ध्यान देने योग्य एक अन्य बात यह है कि आपका पैटर्न अमान्य आईपी पते से मेल खाता है, उदाहरण के लिए 10.bad.ip.address एक निजी आईपी पते के रूप में पहचाना जाएगा। यदि आपके आवेदन में कहीं और आईपी पते मान्य हैं तो कोई समस्या नहीं है, लेकिन आप इसे कसना चाहेंगे।

संबंधित मुद्दे