سؤال

كيف يمكنني تحديد ما إذا كانت سلسلة هو عنوان IP ؟ إما IPv4 أو IPv6?

ما هو الأقل والأكثر عدد من الشخصيات ؟

أعتقد أن هذا سيكون regex الجواب.

هل كانت مفيدة؟

المحلول

ولكن السؤال ليست بسيطة كما افتراض a.b.c.d ... هناك نماذج أكثر مما كنت أدرك.

ولكن بالتأكيد هذا هو جوجل عن هذا السؤال ؟ تقريبا كل regex التمهيدي يمكنك أن تجد في أي مكان يستخدم IP كمثال! ipv4 + regex عشرات 183,000 يضرب!

نصائح أخرى

لقد فعلت هذا من قبل, ولكن أود ريمون تشن وظيفة في:

http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx

حيث كان في الأساس دعاة باستخدام regexes على ما كنت جيدة في:تحليل الرموز.ثم تقييم النتائج.مثاله:

function isDottedIPv4(s)
{
 var match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
 return match != null &&
        match[1] <= 255 && match[2] <= 255 &&
        match[3] <= 255 && match[4] <= 255;
}

انه من الاسهل بكثير أن ننظر في ذلك لنعلم ما يفترض أن تقوم به.

في .صافي هناك IPAddress النوع الذي لديه أسلوب مفيد TryParse.

على سبيل المثال:

if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){
    //validatedIPAddress is good
}

// or more simply:
bool IsValidIPAddress(string possibleIP){
    return System.Net.IPAddress.TryParse(PossibleIPAddress, null)
}

لـ IPv4 يمكنك استخدام هذا التعبير العادية.

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

يبدو معقدة للغاية ولكنه يعمل عن طريق الحد من كل رباعية إلى أرقام 0-255.

@unsliced:صحيح أن هذه المشكلة يمكن الحصول على مجنون قليلا.

إذا كنت حقا بحاجة إلى التعامل مع أي عنوان IP ثم سيكون لديك لوضع معا شيئا أكثر تطورا.

ومع ذلك ، إذا كنت فقط تريد أن تفعل الأساسية التحقق للتأكد من المستخدمين إدخال بيانات منسقة بشكل مناسب ، أعتقد أنه من العدل أن يقيد لهم أحد.ب.ج.د النموذج أعلاه التعبيرات العادية.

@unsliced هذا هو الصحيح ومع ذلك فإنه بالطبع سوف تعتمد على التنفيذ إذا لم يتم تحليل عنوان IP من المستخدم بزيارة موقع الويب الخاص بك ثم هي لا بأس من استخدام التعابير المنطقية كما ينبغي أن يكون في x.x.x.x الشكل.

ل IPv6 هل يمكن استخدام هذا

[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}

ومع ذلك لا يصاب كل شيء لأنه مع IPv6 هو أكثر تعقيدا بكثير ، وفقا ويكيبيديا كل من الأمثلة التالية هي technicaly الصحيح ومع ذلك regex أعلاه سوف قبض فقط هم *

2001:0db8:0000:0000:0000:0000:1428:57ab*
2001:0db8:0000:0000:0000::1428:57ab*
2001:0db8:0:0:0:0:1428:57ab*
2001:0db8:0:0::1428:57ab
2001:0db8::1428:57ab
2001:db8::1428:57ab

منذ نصف regex يتعامل مع حقيقة أن الجزء الأخير لا يملك في النهاية هل يمكن قطع عليه في النصف إذا تك a '.' إلى نهاية الخاص بك ممكن عنوان IP.

شيء من هذا القبيل:

bool IsValidIPAddress(string possibleIP){
  CrazyRegex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}\b
  return Regex.Match(possibleIP+'.', CrazyRegex)
}

IPv4 يصبح: /\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/

أنا غير متأكد حول IPv6 القواعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top