2016-01-14 15 views
5

Tôi đã cố chuyển đổi từ Python sang node.js. Đó là một cách đơn giản chương trình sử dụng regex để kiểm tra xem một địa chỉ IP là Public hay Private:Nội dung của một trận đấu RegExp

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 

tôi thực hiện nó trong Javascript như thế này:

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

nào mang lại cho tôi kết quả như sau:

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

Có vẻ như tôi thích nó hoạt động (thậm chí không chắc chắn tbh). Hai IP cần được công khai đang trả về null vì vậy tôi đoán đúng. Tôi không hiểu đầu ra của trận đấu khác? Tôi không thể tìm hiểu ý nghĩa của nó là

+2

.match() cung cấp cho bạn số lượng các kết quả có thể có trong Chuỗi của bạn. Có lẽ những gì bạn đang tìm kiếm là phương thức .test(). – Shivi

Trả lời

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

mang đến cho bạn kết quả:

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

Điều đó có nghĩa:

  • '192.168.' đó là trận đấu của regex trên chuỗi này. duy nhất
  • undefined là phù hợp cho nhóm đầu tiên trong regex của bạn: (^127\.0\.0\.1)
  • undefined cho nhóm: (^10\.)
  • undefined cho nhóm: (^172\.1[6-9]\.)
  • undefined cho nhóm: (^172\.2[0-9]\.)
  • undefined cho nhóm: (^172\.3[0-1]\.)
  • '192.168.' cho nhóm: (^192\.168\.)

thats vì dấu ngoặc đơn, mỗi một trong số chúng cho khớp (hoặc không xác định), cộng với kết quả mà hàm match() trả về.

1

.match() cung cấp cho bạn số lượng các kết quả có thể có trong Chuỗi của bạn. Có lẽ những gì bạn đang tìm kiếm là phương thức .test().

Bạn cần phải sửa đổi các mã như thế này:

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

Bạn có thể tham khảo ở đây để biết thêm chi tiết về phương pháp phù hợp: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/match

1

String.prototype.match():

Nếu biểu thức chính quy không không bao gồm cờ g, trả về kết quả tương tự như RegExp.exec(). Mảng trả về có một thuộc tính đầu vào bổ sung, chứa chuỗi gốc đã được phân tích cú pháp. Ngoài ra, nó có một thuộc tính chỉ mục, biểu thị chỉ số dựa trên số không của đối sánh trong chuỗi.

RegExp.prototype.exec():

Mảng được trả về có nội dung phù hợp như mục đầu tiên, và sau đó một mục cho mỗi ngoặc chụp mà phù hợp có chứa văn bản mà bị bắt.

Nếu khớp không thành công, phương thức exec() trả về giá trị rỗng.

Có lẽ bạn muốn sử dụng RegExp.prototype.test() thay vì:

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

Bạn đang sử dụng String.prototype.match -method. Theo tài liệu, nó trả về "An Array chứa kết quả phù hợp hoặc null nếu không có kết quả phù hợp."

Trong Javascript, một Array là trung thực và null bị lỗi. Điều này có nghĩa rằng việc kiểm tra sau đây sẽ thực sự kiểm tra một cách chính xác nếu một chuỗi là một địa chỉ IP:

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

gì bạn đang nhìn thấy trong mảng là các phần khác nhau của chuỗi ban đầu mà được kết hợp bởi các nhóm phù hợp trong biểu thức chính quy . Giá trị null là các kết quả phù hợp cho các nhóm không có mặt, mà bạn có nhiều.

Nhưng tôi nghĩ bạn có thể tiến xa hơn một bước.Nếu bạn chỉ muốn kiểm tra xem một chuỗi có khớp với cụm từ thông dụng hay không, tôi sẽ giới thiệu RegExp.prototype.test. Phương pháp này trả về một boolean (true|false), vì vậy bạn không cần phải dựa vào truthy- hoặc falsy-Ness:

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

Bạn không cần sử dụng nhóm đối sánh, trừ khi bạn muốn nắm bắt phần khớp của địa chỉ ip, nhưng điều đó không cần thiết trong trường hợp của bạn. Trong Javascript bạn có thể sử dụng mẫu này regex (lưu ý không có nhóm phù hợp):

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

Và sau đó sử dụng nó như thế này:

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

Hoặc, thậm chí tốt hơn, sử dụng RegEx.test():

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

Tương tự đối với Python, các nhóm đối sánh không bắt buộc.

Một điều đáng chú ý khác là mẫu của bạn sẽ khớp với các địa chỉ IP không hợp lệ, ví dụ: 10.bad.ip.address sẽ được phát hiện là địa chỉ IP riêng. Không phải là vấn đề nếu đang xác thực địa chỉ IP ở nơi khác trong ứng dụng của bạn, nhưng bạn có thể muốn thắt chặt nó.

Các vấn đề liên quan