বৈধ IPv6 ঠিকানার সাথে মেলে এমন নিয়মিত অভিব্যক্তি


111

আমার নিয়মিত ভাব প্রকাশ করতে সমস্যা হচ্ছে যা বৈধ আইপিভি 6 ঠিকানার সাথে মেলে, তাদের সংকীর্ণ আকারে ( ::প্রতিটি বাইট জুটি বাদ দেওয়া বা অগ্রণী জিরো সহ) সহ matches

কেউ কি কোনও নিয়মিত ভাব প্রকাশের পরামর্শ দিতে পারে যা প্রয়োজনীয়তা পূরণ করবে?

আমি প্রতিটি বাইট জুড়ি প্রসারিত করা এবং ফলাফলটিকে একটি সহজ রেগেক্সের সাথে মেলাতে বিবেচনা করছি।


1
পরীক্ষা করে দেখুন intermapper.com/ipv6validator .. এটা এই লিঙ্ক Perl পরীক্ষা স্ক্রিপ্ট
Mottie

আমি নীচের সমস্ত উত্তর চেষ্টা করেছি এবং তারা আমার সমস্ত পরীক্ষার কেসগুলির জন্য কাজ করে না এবং / অথবা এগুলিতে আইপিভি 4 অন্তর্ভুক্ত থাকে যা জন্য জিজ্ঞাসা করা হয়নি। : আমি এই পাওয়া যায় এতদূর পরিষ্কার সমাধান হতে stackoverflow.com/a/21944928/3112803
gfrobenius

উত্তর:


251

আমি POSIX নিয়মিত প্রকাশের সাথে কাজ করার জন্য @ ফ্যাক্টর মিস্টিকের উত্তর পেতে অক্ষম ছিলাম, তাই আমি এমন একটি লিখেছিলাম যা পসিক্স নিয়মিত প্রকাশ এবং পিইআরএল নিয়মিত প্রকাশের সাথে কাজ করে।

এটি মিলবে:

আইপিভি 6 নিয়মিত এক্সপ্রেশন:

(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

পড়ার স্বাচ্ছন্দ্যের জন্য, নীচেরটি উপরের নিয়মিত প্রকাশটি প্রধান OR পয়েন্টগুলিতে পৃথক লাইনে বিভক্ত হয়:

# IPv6 RegEx
(
([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|          # 1:2:3:4:5:6:7:8
([0-9a-fA-F]{1,4}:){1,7}:|                         # 1::                              1:2:3:4:5:6:7::
([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|         # 1::8             1:2:3:4:5:6::8  1:2:3:4:5:6::8
([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|  # 1::7:8           1:2:3:4:5::7:8  1:2:3:4:5::8
([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|  # 1::6:7:8         1:2:3:4::6:7:8  1:2:3:4::8
([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|  # 1::5:6:7:8       1:2:3::5:6:7:8  1:2:3::8
([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|  # 1::4:5:6:7:8     1:2::4:5:6:7:8  1:2::8
[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|       # 1::3:4:5:6:7:8   1::3:4:5:6:7:8  1::8  
:((:[0-9a-fA-F]{1,4}){1,7}|:)|                     # ::2:3:4:5:6:7:8  ::2:3:4:5:6:7:8 ::8       ::     
fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|     # fe80::7:8%eth0   fe80::7:8%1     (link-local IPv6 addresses with zone index)
::(ffff(:0{1,4}){0,1}:){0,1}
((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}
(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|          # ::255.255.255.255   ::ffff:255.255.255.255  ::ffff:0:255.255.255.255  (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
([0-9a-fA-F]{1,4}:){1,4}:
((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}
(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])           # 2001:db8:3:4::192.0.2.33  64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
)

# IPv4 RegEx
((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])

উপরেরটি বোঝার জন্য আরও সহজ করার জন্য, নিম্নলিখিত "সিউডো" কোডটি উপরের প্রতিরূপ তৈরি করেছে:

IPV4SEG  = (25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])
IPV4ADDR = (IPV4SEG\.){3,3}IPV4SEG
IPV6SEG  = [0-9a-fA-F]{1,4}
IPV6ADDR = (
           (IPV6SEG:){7,7}IPV6SEG|                # 1:2:3:4:5:6:7:8
           (IPV6SEG:){1,7}:|                      # 1::                                 1:2:3:4:5:6:7::
           (IPV6SEG:){1,6}:IPV6SEG|               # 1::8               1:2:3:4:5:6::8   1:2:3:4:5:6::8
           (IPV6SEG:){1,5}(:IPV6SEG){1,2}|        # 1::7:8             1:2:3:4:5::7:8   1:2:3:4:5::8
           (IPV6SEG:){1,4}(:IPV6SEG){1,3}|        # 1::6:7:8           1:2:3:4::6:7:8   1:2:3:4::8
           (IPV6SEG:){1,3}(:IPV6SEG){1,4}|        # 1::5:6:7:8         1:2:3::5:6:7:8   1:2:3::8
           (IPV6SEG:){1,2}(:IPV6SEG){1,5}|        # 1::4:5:6:7:8       1:2::4:5:6:7:8   1:2::8
           IPV6SEG:((:IPV6SEG){1,6})|             # 1::3:4:5:6:7:8     1::3:4:5:6:7:8   1::8
           :((:IPV6SEG){1,7}|:)|                  # ::2:3:4:5:6:7:8    ::2:3:4:5:6:7:8  ::8       ::       
           fe80:(:IPV6SEG){0,4}%[0-9a-zA-Z]{1,}|  # fe80::7:8%eth0     fe80::7:8%1  (link-local IPv6 addresses with zone index)
           ::(ffff(:0{1,4}){0,1}:){0,1}IPV4ADDR|  # ::255.255.255.255  ::ffff:255.255.255.255  ::ffff:0:255.255.255.255 (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
           (IPV6SEG:){1,4}:IPV4ADDR               # 2001:db8:3:4::192.0.2.33  64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
           )

আমি গিটহাবের উপরে একটি স্ক্রিপ্ট পোস্ট করেছি যা নিয়মিত অভিব্যক্তিটি পরীক্ষা করে: https://gist.github.com/syzdek/6086792


3
আপনার আইপিভি 4 127.000.000.001
রেজেেক্স

21
আইপিভি 4 বিভাগগুলিতে নেতৃস্থানীয় শূন্যগুলি অন্তর্ভুক্ত করা উচিত নয়। যদি একটি শীর্ষস্থানীয় শূন্য উপস্থিত থাকে, আইপিভি 4 বিভাগটি অষ্টালে ব্যাখ্যা করা উচিত। সুতরাং উপরের IPV4SEG '000' না দেওয়ার ক্ষেত্রে সঠিক। এটি '00' এর অনুমতি দেয় যা এটি করা উচিত নয়।
পার

3
ব্রাউজারে আমার পক্ষে যেমনটা আশা করতাম তেমন কাজ করিনি। যাচাইকরণ এমনকি reg.test ('3zzzzffe: 1900: 4545: 3: 200: f8ff: fe21: 67cf') যা স্পষ্টতই কোনও বৈধ IPv6 ঠিকানা নয়। : Regex সঙ্গে অনেক ভালো ফলাফল এখানে ছিল nbviewer.ipython.org/github/rasbt/python_reference/blob/master/...
Capaj

7
চমত্কার ipv6 রেজেক্স। স্থানীয় বিভাগের সাথে একটি ছোট বাগ পাওয়া গেছে found আপনার ছিল fe80যেখানে এটির মতো কিছু হওয়া উচিত [fF][eE]80এবং ffff[fF]{4}
এটির

4
আপনি যদি যত্ন নেন এবং সেগুলি ফর্ম্যাট করেন তবে রেজিেক্সগুলি (যে কোনও উত্স কোডের মতোই একইভাবে) প্রকৃতপক্ষে পাঠযোগ্য হতে পারে তা দেখানোর জন্য +1
ন্যাটিক্স

52

নিম্নলিখিতগুলি IPv4, IPv6 (পূর্ণ এবং সংক্ষেপিত), এবং IPv6v4 (পূর্ণ এবং সংক্ষেপিত) ঠিকানাগুলি বৈধ করবে:

'/^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$/iD'

8
আইপ-এসকে বৈধকরণের কাজটি ফ্রাঙ্ক ক্রুয়েজারের পরামর্শ অনুসারে করা যেতে পারে, তবুও এই সমাধানটি আসলে সেই প্রশ্নের উত্তর দেয় (যদিও আমি এখনও এটি পুরোপুরি পরীক্ষা করে দেখিনি) পাশাপাশি আপনার যদি এমন অনেক আইপি-এস রয়েছে যা আপনি সিনট্যাক্টিকালি টেস্ট চান এবং হতে পারে একটি লাইনের পাঠ্য মেলাতে, আপনি আইপি বৈধকরণ কৌশলটি ব্যবহার করতে পারবেন না।
গিউরি

হাই, আমি এই RegExp পরীক্ষা করেছি এবং আমার জন্য কাজ করে না। এটি বলে যে ডি একটি অবৈধ পতাকা এবং আমি এটি সরিয়ে ফেললে এটি বলে "
সিনট্যাক্সেরর

3
জাভাস্ক্রিপ্ট পার্ল-স্টাইল নিয়মিত এক্সপ্রেশনগুলির একটি উপসেট প্রয়োগ করে, পুরো পিসিআরই নয়। আমার রেজেক্স পিসিআরইর কয়েকটি উন্নত বৈশিষ্ট্য ছাড়া কাজ করবে না।
মাইকেলরশটন

2
এটি আমার জন্য সি #
সরাতে

1
ব্যর্থ পরীক্ষার কেস: FE80: 0000: 0000: 0000: 0202: B3FF: FE1E: 8329 এই তারিখে এলিক্সির সর্বশেষ সংস্করণ ব্যবহার করছে, যা নীচে পিসিআরই ব্যবহার করে।
pmarreck

23

মনে হচ্ছে আপনি পাইথন ব্যবহার করছেন। যদি তা হয় তবে আপনি এর মতো কিছু ব্যবহার করতে পারেন:

import socket

def check_ipv6(n):
    try:
        socket.inet_pton(socket.AF_INET6, n)
        return True
    except socket.error:
        return False

print check_ipv6('::1') # True
print check_ipv6('foo') # False
print check_ipv6(5)     # TypeError exception
print check_ipv6(None)  # TypeError exception

পাইথন পেতে আইপিভি 6 সংকলন করতে হবে বলে আমি মনে করি না inet_pton, যা আপনি socket.AF_INETপ্রথম প্যারামিটার হিসাবে পাস করলে আইপিভি 4 অ্যাড্রেসগুলিও পার্স করতে পারে । দ্রষ্টব্য: এটি ইউনিক্স নন সিস্টেমে কাজ না করে।


4
ধারাটিতে আপনার ব্যতিক্রম প্রকারটি নির্দিষ্ট করা উচিত except। অন্যথায়, exceptসমস্ত কিছু ধরবে এবং সম্পর্কযুক্ত ত্রুটিগুলি মাস্ক করতে পারে। এখানে টাইপ হওয়া উচিত socket.error
আয়মান হৌরিহ

ক) ইনট_পটন অন্য ব্যতিক্রমগুলি ছুঁড়ে না ফেলেছে, যদি না ডকগুলি ভুল হয়, এবং খ) তা না হলে, আপনি আর কী ফিরিয়ে দেবেন?
জো হিলডেব্র্যান্ড

2
পুনরায়: অন্যান্য ত্রুটিগুলি ... ব্যবহারকারী যদি একটি স্ট্রিং-এ পাস করেন তবে টাইপ-এয়ারর খেয়ে যায়। স্পষ্টতই একটি তালিকা কোনও আইপিভি 6 নয় তবে আমি সম্ভবত এটির মতো কার্প রাখতে চাই যা আমি ভুল টাইপের মধ্যে দিয়ে যাচ্ছি।
গ্রেগ লিন্ড

1
+1 এটি আমাকে অনেক সাহায্য করেছে। কয়েকটি অতিরিক্ত পয়েন্ট যোগ করা উচিত: 1) socket.inet_pton আইপি ঠিকানার উভয় পরিবারের (আইপি এবং আইপিভি 6) বৈধতা পরীক্ষা করতে ব্যবহার করা যেতে পারে। ২) এখানকার দস্তাবেজগুলি ( docs.python.org/2/library/sket.html ) পরামর্শ দেয় যে এটি ইউনিক্স প্ল্যাটফর্মগুলিতে উপলব্ধ। এটি উইন-প্ল্যাটফর্মগুলিতে উপলভ্য নয়।
mkoistinen

জাঙ্গো ব্যবহার করে এবং এটি সাহায্য করে!
ইলাদ রৌপ্য

23

" আইপিভি 6 রেজেক্স " থেকে:

(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,6}\Z)|
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}\Z)|
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}\Z)|
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}\Z)|
(\A([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}\Z)|
(\A([0-9a-f]{1,4}:){1,6}(:[0-9a-f]{1,4}){1,1}\Z)|
(\A(([0-9a-f]{1,4}:){1,7}|:):\Z)|
(\A:(:[0-9a-f]{1,4}){1,7}\Z)|
(\A((([0-9a-f]{1,4}:){6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
(\A(([0-9a-f]{1,4}:){5}[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
(\A([0-9a-f]{1,4}:){5}:[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,3}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,2}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,1}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A(([0-9a-f]{1,4}:){1,5}|:):(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A:(:[0-9a-f]{1,4}){1,5}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)

45
এর মতো নিয়মিত প্রকাশটি একটি "কোড গন্ধ" হওয়া উচিত যা নিয়মিত প্রকাশটি এখানে সর্বোত্তম উপযুক্ত সমাধান নয়। (যদিও, আমি অনুমান করি যে অপটি এর জন্য জিজ্ঞাসা করেছিল ...)
থানাটোস

10
@ ব্যবহারকারী 712092 - প্রত্যেকে এর মতো চোখের সংক্ষিপ্তসারগুলির সাথে একটি কোড বেস দেখেছেন এমন সবাই
ড্যানিয়েলপপস

2
এটি আরইএসের কাছে সম্পূর্ণ অপ্রয়োজনীয় ট্র্যাভাস্টি। যে প্রোগ্রামটি এটি উত্পন্ন তা বুঝতে পারে না যে এটি কী করছে। একটি মানুষ কখনও এইভাবে না করে। আপাত জটিলতায় বোকা বোকাবেন না - আরইএস আসলেই অনেক লোকের কাছে "কালো যাদু", তবে এগুলি অন্য গ্রহে রাখার কোনও কারণ নেই!
চক কলারস

+1 তবে ওএমজি-র আরও ভাল উপায় এটি করতে হবে: পি রেফারেন্সের জন্য: কারাগারগুলির
টিলো

1
এটি আসলে একটি কোড গন্ধ; তবে একবার দেখার পরে আপনি দেখতে পাবেন যে প্রতিটি রেজেক্স মোটামুটি সংক্ষিপ্ত। সমস্যাটি হ'ল আইপিভি 6 এর 'সংক্ষেপণ' দ্বারা তৈরি বিভিন্ন প্যাটার্ন রয়েছে - কলোনগুলির শুরু, মাঝারি এবং শেষ, শীর্ষে আপনি যদি আপনার ডাবল কোলন ব্যবহার করেন তবে আপনি এটির উপরে আবার ব্যবহার করতে পারবেন না ডাবল আগে এবং পরে কোলন যোগ করতে হবে। পার্ল 6 এটি মোকাবেলা করতে সক্ষম হতে পারে তবে এটি পিসিআরআই সিনট্যাক্সের বাইরে। (পিএস - আমি এম্বেড করা আইপিভি 4 টি শেষ পর্যন্ত গণনা করি না, যা
আইপিভি

11

আমাকে ফ্র্যাঙ্ক ক্রুয়েজারের কাছ থেকে উত্তরটি দৃ strongly ়ভাবে দ্বিতীয় করতে হবে ।

যদিও আপনি বলেন যে কোনও আইপিভি 6 ঠিকানার সাথে মেলে আপনার একটি নিয়মিত প্রকাশ দরকার, আমি ধরে নিচ্ছি যে আপনার সত্যিকারের যা প্রয়োজন তা হ'ল কোনও প্রদত্ত স্ট্রিংটি একটি বৈধ আইপিভি 6 ঠিকানা কিনা তা পরীক্ষা করতে সক্ষম হবেন। এখানে একটি সূক্ষ্ম তবে গুরুত্বপূর্ণ পার্থক্য রয়েছে।

প্রদত্ত স্ট্রিংটি একটি বৈধ IPv6 ঠিকানা কিনা তা পরীক্ষা করার একাধিক উপায় রয়েছে এবং নিয়মিত প্রকাশের মিলটি কেবল একটি সমাধান is

পারলে বিদ্যমান লাইব্রেরি ব্যবহার করুন। লাইব্রেরিতে কম বাগ থাকবে এবং এর ব্যবহারের ফলে আপনার বজায় রাখার জন্য কম কোড আসবে in

ফ্যাক্টর মিস্টিক দ্বারা প্রস্তাবিত নিয়মিত প্রকাশটি দীর্ঘ এবং জটিল। এটি সম্ভবত কার্যকরভাবে কাজ করে তবে অপ্রত্যাশিতভাবে ব্যর্থ হলে আপনি কীভাবে মোকাবেলা করবেন তাও আপনার বিবেচনা করা উচিত। আমি এখানে যে বক্তব্যটি দেওয়ার চেষ্টা করছি সেটি হ'ল আপনি যদি নিজের নিয়মিত অভিব্যক্তি নিজে তৈরি করতে না পারেন তবে আপনি সহজেই এটি ডিবাগ করতে পারবেন না।

আপনার যদি উপযুক্ত লাইব্রেরি না থাকে তবে নিজের আইপিভি 6 যাচাইকরণের রুটিনটি নিয়মিত প্রকাশের উপর নির্ভর করে না এমনটি লিখতে ভাল। আপনি যদি এটি লিখেন তবে আপনি এটি বুঝতে পারবেন এবং এটি বুঝতে পারলে আপনি এটি ব্যাখ্যা করতে মন্তব্য যুক্ত করতে পারেন যাতে অন্যরাও বুঝতে পারে এবং পরবর্তীকালে এটি বজায় রাখতে পারে।

নিয়মিত ভাব প্রকাশের সময় সতর্কতার সাথে কাজ করুন যার কার্যকারিতা আপনি অন্য কাউকে ব্যাখ্যা করতে পারবেন না।


1
দুটি নিয়মিত প্রকাশ, একটি উদার প্রকাশ এবং প্রথম দ্বারা অনুমোদিত অবৈধ ঠিকানাগুলি ফাঁদে ফেলতে ব্যতিক্রম অভিব্যক্তি ব্যবহার করা এক অভিব্যক্তির চেয়ে সহজ হতে পারে ( return ex1.match(S) && ! ex2.match(S))।
রায়েদওয়াল্ড

4
আপনি ধরে নিচ্ছেন যে যখন তিনি প্রায় অবশ্যই পাঠ্যের একটি বৃহত ব্লকে আইপি অনুসন্ধান করছেন তখন তিনি পৃথক আইপিগুলি বৈধতা দিচ্ছেন।
নবীন

8

আমি কোনও আইপিভি 6 বিশেষজ্ঞ নই তবে আমি মনে করি আপনি এটির মাধ্যমে আরও সহজেই খুব ভাল ফলাফল পেতে পারবেন:

^([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4})$

"একটি বৈধ ipv6" এর উত্তর দেওয়া আমার কাছে ঠিক মনে হচ্ছে। এটিকে কিছু অংশে ভাঙতে ... ভুলে যাও। আমি অনির্ধারিতটিকে বাদ দিয়েছি (: :) যেহেতু আমার ডাটাবেসে "অনির্দিষ্ট ঠিকানা" রাখার কোনও ব্যবহার নেই।

শুরু: ^([0-9A-Fa-f]{0,4}:){2,7}<- সংকোচযোগ্য অংশের সাথে মেলে, আমরা এটি অনুবাদ করতে পারি: 2 এবং 7 এর মধ্যে কোলন যার মধ্যে হেক্সাডেসিমাল সংখ্যা থাকতে পারে।

এরপরে: [0-9A-Fa-f]{1,4}$<- একটি হেক্সাডেসিমাল সংখ্যা (শীর্ষস্থানীয় 0 বাদ দেওয়া) বা ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}<- একটি আইপিভি 4 অ্যাড্রেস


1
আসলে ওপিএস প্রশ্নটির সাথে লেগে থাকা এবং কিছুটা কার্যকর এমন তুলনামূলক সুদর্শন রেজেক্স উপস্থাপনের জন্য +1।
xebeche

1
এটি ":: 1" এর সাথে মেলে না
lsalamon

তাই না? জাভা রেজেক্স সিনটেক্সটে এটি মেলে:start() = 0, end() = 3 group(0) = "::1" group(1) = ":" group(2) = "1" group(3) = "null" group(4) = "null" group(5) = "null"
রেমি মরিন

অন্য কোথাও কেউ আমাকে আমার রেইজেক্স, সংকুচিত অংশ "::" নিয়ে সমস্যা সম্পর্কে অবহিত করেছেন কেবল একবারই উপস্থিত হতে পারে। সুতরাং ":: 1 :: 2" আমার রেজেক্সের সাথে মিলবে তবে এটি কোনও বৈধ আইপিভি 6 নয়। একটি দ্বিতীয় রেজেক্স এই ক্ষেত্রেটিকে বৈধতা দিতে পারে। সম্পূর্ণ সুপারিশটি ছিল যাচাই করার জন্য একটি স্টেটফুল পার্সার ব্যবহার করা। আমি সম্মত হচ্ছি যে ফলাফলের কোডটি পড়া এবং বজায় রাখা আরও সহজ হবে (এবং সম্ভবত ইতিমধ্যে কোথাও কোনও উন্মুক্ত উত্সে এটি কোড করেছে)।
রেমি মরিন

8

এটি লুপব্যাকটি (:: 1) পাশাপাশি এবং আইপিভি 6 ঠিকানাও ধারণ করে। square} + এ + পরিবর্তন হয়েছে এবং এটি লিখুন: প্রথম বর্গাকার বন্ধনীটির ভিতরে।

([a-f0-9:]+:+)+[a-f0-9]+

ifconfig -a আউটপুট http://regexr.com/ দিয়ে পরীক্ষিত

ইউনিক্স বা ম্যাক ওএসএক্স টার্মিনাল ও বিকল্পটি কেবল :: 1 সহ মিলবে আউটপুট (ipv6) প্রদান করে

ifconfig -a | egrep -o '([a-f0-9:]+:+)+[a-f0-9]+'

সমস্ত আইপি ঠিকানাগুলি (আইপিভি 4 বা আইপিভি 6) এবং ইউনিক্স ওএসএক্স পদে মুদ্রণ ম্যাচ পান

ifconfig -a | egrep -o '([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) | (([a-f0-9:]+:+)+[a-f0-9]+)'

আমি সরলতা পছন্দ। এটি শেষ পর্যন্ত আমার পক্ষে কাজ করেছে:ip a | grep -Po '[\w:]+:+[\w:]+'
নোয়াম মনস

কৌতুক প্রশংসা!
সৌম্য কান্তি

আমি যখন ipconfig / all চালনা করি তখন আমার আইপি ঠিকানাটি% 10 দিয়ে শেষ হয়, এই অংশটি এই অংশটির সাথে মেলে না?
পিটার

7

এই নিয়মিত এক্সপ্রেশনটি জিএনইউ সি ++ এর সাথে নিয়মিত এক্সটেন্ডেড মোড ব্যবহৃত রেগেক্সের প্রয়োগের সাথে বৈধ IPv6 এবং IPv4 ঠিকানার সাথে মিলবে:

"^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:)))(%.+)?\s*$"

5

সতর্ক থাকুন! জাভাতে, ইনটএড্রেস এবং সম্পর্কিত ক্লাসগুলির ব্যবহার (ইনট 4 অ্যাড্রেস, ইনেট 6 অ্যাড্রেস, ইউআরএল) নেটওয়ার্ক ট্রাফিকের সাথে জড়িত থাকতে পারে! যেমন DNS সমাধান (URL.equals, স্ট্রিং থেকে InetAdress!)। এই কলটি দীর্ঘ সময় নিতে পারে এবং অবরুদ্ধ হয়!

আইপিভি 6 এর জন্য আমার এরকম কিছু রয়েছে। অবশ্যই এই আইপিভি 6 এর খুব সূক্ষ্ম বিবরণ হ্যান্ডেল করে না যেমন জোন সূচকগুলি কেবলমাত্র আইপিভি 6 ঠিকানার কয়েকটি শ্রেণিতে অনুমোদিত। এবং এই রেজেক্সটি গ্রুপ ক্যাপচারের জন্য লিখিত নয়, এটি কেবল একটি "ম্যাচ" ধরণের রিজেপেক্স।

S - আইপিভি 6 বিভাগ = [0-9a-f]{1,4}

I - আইপিভি 4 = (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})

স্কিম্যাটিক (প্রথম অংশ আইপিভি 4 অ্যাড্রেসের সাথে আইপিভি 6 প্রত্যয়ের সাথে মেলে, দ্বিতীয় অংশটি আইপিভি addresses অ্যাড্রেসের সাথে মেলে, জোন ইনডেক্সের শেষ পৃষ্ঠপোষক):

(
(
::(S:){0,5}|
S::(S:){0,4}|
(S:){2}:(S:){0,3}|
(S:){3}:(S:){0,2}|
(S:){4}:(S:)?|
(S:){5}:|
(S:){6}
)
I

|

:(:|(:S){1,7})|
S:(:|(:S){1,6})|
(S:){2}(:|(:S){1,5})|
(S:){3}(:|(:S){1,4})|
(S:){4}(:|(:S){1,3})|
(S:){5}(:|(:S){1,2})|
(S:){6}(:|(:S))|
(S:){7}:|
(S:){7}S
)

(?:%[0-9a-z]+)?

এবং এখানে সম্ভবত রেজেক্স (কেস সংবেদনশীল, কখনও কি প্রয়োজন যেমন লাইনের শুরু / শেষ ইত্যাদির সাথে ঘিরে রয়েছে):

(?:
(?:
::(?:[0-9a-f]{1,4}:){0,5}|
[0-9a-f]{1,4}::(?:[0-9a-f]{1,4}:){0,4}|
(?:[0-9a-f]{1,4}:){2}:(?:[0-9a-f]{1,4}:){0,3}|
(?:[0-9a-f]{1,4}:){3}:(?:[0-9a-f]{1,4}:){0,2}|
(?:[0-9a-f]{1,4}:){4}:(?:[0-9a-f]{1,4}:)?|
(?:[0-9a-f]{1,4}:){5}:|
(?:[0-9a-f]{1,4}:){6}
)
(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})|

:(?::|(?::[0-9a-f]{1,4}){1,7})|
[0-9a-f]{1,4}:(?::|(?::[0-9a-f]{1,4}){1,6})|
(?:[0-9a-f]{1,4}:){2}(?::|(?::[0-9a-f]{1,4}){1,5})|
(?:[0-9a-f]{1,4}:){3}(?::|(?::[0-9a-f]{1,4}){1,4})|
(?:[0-9a-f]{1,4}:){4}(?::|(?::[0-9a-f]{1,4}){1,3})|
(?:[0-9a-f]{1,4}:){5}(?::|(?::[0-9a-f]{1,4}){1,2})|
(?:[0-9a-f]{1,4}:){6}(?::|(?::[0-9a-f]{1,4}))|
(?:[0-9a-f]{1,4}:){7}:|
(?:[0-9a-f]{1,4}:){7}[0-9a-f]{1,4}
)

(?:%[0-9a-z]+)?

4

নিম্নলিখিত রেগেক্স কেবল আইপিভি 6 এর জন্য। গ্রুপ 1 আইপি এর সাথে মেলে।

(([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4})

+1 কোনও মানুষ বুঝতে পারে না এমন একটি নিখুঁত সুপার জটিল রেগেক্স থাকা সর্বদা প্রয়োজন হয় না। আমি এটি ব্যবহার করব কারণ এটি কী করে তা আমি বুঝতে পারি এবং আমার ক্ষেত্রে, আমি নিশ্চিত হতে পারি যে যদি আমি এমন কিছু পাই যা একটি বৈধ ipv6 এর সাথে সাদৃশ্যপূর্ণ, তবে এটি একটি বৈধ ipv6।
ডেভিড এল।

3
এটি মিলবে না: fe80 :: 1 বা 2342: 32fd :: 2d32
জেমস

3

একটি সাধারণ রেজেক্স যা মিলবে, তবে আমি কোনও ধরণের বৈধতার জন্য এটির প্রস্তাব দেব না:

([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}

এটি ঠিকানার যে কোনও জায়গায় সংকোচনের সাথে মেলে নোট করুন, যদিও এটি লুপব্যাক ঠিকানার সাথে মেলে না: :: 1। রেজেক্সকে সহজ রাখার জন্য আমি এটি একটি যুক্তিসঙ্গত সমঝোতা মনে করি।

আইটিভি 2 স্মার্ট নির্বাচনের নিয়মে আমি সফলভাবে এটি আইভিভি 6 অ্যাড্রেসকে চতুর্ভুজ ক্লিক করতে ব্যবহার করেছি ।


3
আপনি বোঝানো A-Fনা A-Z! এছাড়াও খেয়াল করুন যে আপনি ডটেড-কোয়াড স্বরলিপি বাদ দিচ্ছেন।
xebeche

3

আপনি যদি পার্ল ব্যবহার করেন তবে নেট :: IPv6Addr ব্যবহার করে দেখুন

use Net::IPv6Addr;

if( defined Net::IPv6Addr::is_ipv6($ip_address) ){
  print "Looks like an ipv6 address\n";
}

NetAddr :: আইপি

use NetAddr::IP;

my $obj = NetAddr::IP->new6($ip_address);

যাচাই :: আইপি

use Validate::IP qw'is_ipv6';

if( is_ipv6($ip_address) ){
  print "Looks like an ipv6 address\n";
}

বা ডেটা :: যাচাই :: আইপি search.cpan.org/~neely/Data-Validate-IP-0.11/lib/Data/Validate/...
ক্যালিমো

2

ইন Scala সুপরিচিত এ্যাপাচি কমন্স ভ্যালিডেটর ব্যবহার করুন।

http://mvnrepository.com/artifact/commons-validator/commons-validator/1.4.1

libraryDependencies += "commons-validator" % "commons-validator" % "1.4.1"


import org.apache.commons.validator.routines._

/**
 * Validates if the passed ip is a valid IPv4 or IPv6 address.
 *
 * @param ip The IP address to validate.
 * @return True if the passed IP address is valid, false otherwise.
 */  
 def ip(ip: String) = InetAddressValidator.getInstance().isValid(ip)

পদ্ধতির পরীক্ষার অনুসরণ ip(ip: String):

"The `ip` validator" should {
  "return false if the IPv4 is invalid" in {
    ip("123") must beFalse
    ip("255.255.255.256") must beFalse
    ip("127.1") must beFalse
    ip("30.168.1.255.1") must beFalse
    ip("-1.2.3.4") must beFalse
  }

  "return true if the IPv4 is valid" in {
    ip("255.255.255.255") must beTrue
    ip("127.0.0.1") must beTrue
    ip("0.0.0.0") must beTrue
  }

  //IPv6
  //@see: http://www.ronnutter.com/ipv6-cheatsheet-on-identifying-valid-ipv6-addresses/
  "return false if the IPv6 is invalid" in {
    ip("1200::AB00:1234::2552:7777:1313") must beFalse
  }

  "return true if the IPv6 is valid" in {
    ip("1200:0000:AB00:1234:0000:2552:7777:1313") must beTrue
    ip("21DA:D3:0:2F3B:2AA:FF:FE28:9C5A") must beTrue
  }
}

আকর্ষণীয়, এটি দাবি করে যে এটি একটি বৈধ ঠিকানা, " যদি পাস করা আইপি বৈধ আইপিভি 4 বা আইপিভি 6 ঠিকানা হয় তবে তা যাচাই করে" "তবে এটি কেবলমাত্র এটি বৈধ ঠিকানা হিসাবে ফর্ম্যাট হয়েছে কিনা তা যাচাই করে। উদাহরণস্বরূপ, 1200:0000:AB00:1234:0000:2552:7777:1313একটি আইপিভি 6 ঠিকানার জন্য একটি বৈধ ফর্ম্যাট, তবে পরীক্ষার পদ্ধতিটি প্রত্যাবর্তনের সাথে সাথে এটি কোনও বৈধ IPv6 ঠিকানা নয়। আমি বাজি ধরব এটি মনে করে 241.54.113.65এটি একটি বৈধ IPv4 ঠিকানা।
রন মাউপিন

2

অন্যান্য উত্তরের অন্তর্ভুক্ত নিদর্শনগুলি পর্যালোচনা করে এমন অনেকগুলি নিখুঁত নিদর্শন রয়েছে যা দলগুলির রেফারেন্স এবং লুক হেড ব্যবহার করে উন্নত করা যায়। এখানে স্ব-রেফারেন্সিংয়ের একটি প্যাটার্নের উদাহরণ এখানে আমি পিএইচপি ব্যবহার করতে পারতাম যদি:

^(?<hgroup>(?<hex>[[:xdigit:]]{0,4}) # grab a sequence of up to 4 hex digits
                                     # and name this pattern for usage later
     (?<!:::):{1,2})                 # match 1 or 2 ':' characters
                                     # as long as we can't match 3
 (?&hgroup){1,6} # match our hex group 1 to 6 more times
 (?:(?:
    # match an ipv4 address or
    (?<dgroup>2[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(?&dgroup)
    # match our hex group one last time
    |(?&hex))$

দ্রষ্টব্য: পিএইচপি এর জন্য ফিল্টার একটি বিল্ট ইন রয়েছে যা এই প্যাটার্নের চেয়ে ভাল সমাধান হতে পারে।

Regex101 বিশ্লেষণ


2

আমি পাইথন ব্যবহার করে নিম্নলিখিতটি তৈরি করেছি এবং পুনরায় মডিউলটির সাথে কাজ করি। চেহারা-পূর্বের বক্তব্যগুলি নিশ্চিত করে যে ঠিকানায় ডট বা কলোনগুলির সঠিক সংখ্যা উপস্থিত রয়েছে। এটি IPv6 স্বরলিপিতে IPv4 সমর্থন করে না।

pattern = '^(?=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$)(?:(?:25[0-5]|[12][0-4][0-9]|1[5-9][0-9]|[1-9]?[0-9])\.?){4}$|(?=^(?:[0-9a-f]{0,4}:){2,7}[0-9a-f]{0,4}$)(?![^:]*::.+::[^:]*$)(?:(?=.*::.*)|(?=\w+:\w+:\w+:\w+:\w+:\w+:\w+:\w+))(?:(?:^|:)(?:[0-9a-f]{4}|[1-9a-f][0-9a-f]{0,3})){0,8}(?:::(?:[0-9a-f]{1,4}(?:$|:)){0,6})?$'
result = re.match(pattern, ip)
if result: result.group(0)

2

আপনি এম্বেড থাকা ipv4 এবং ঠিকানাগুলি সংক্ষেপিত ঠিকানাগুলি বিবেচনা করলে আইপিভি 6-এর জন্য রেজিক্সগুলি সত্যই জটিল হয়ে উঠতে পারে, আপনি এই উত্তরগুলির কয়েকটি থেকে দেখতে পারেন।

ওপেন-সোর্স আইপিএড্রেস জাভা লাইব্রেরি আইপিভি 6 এবং আইপিভি 4 এর সমস্ত মান উপস্থাপনাকে বৈধতা দেবে এবং উপসর্গের দৈর্ঘ্য (এবং এর বৈধতা) সমর্থন করে। দাবি অস্বীকার: আমি সেই লাইব্রেরির প্রকল্প পরিচালক।

কোড উদাহরণ:

        try {
            IPAddressString str = new IPAddressString("::1");
            IPAddress addr = str.toAddress();
            if(addr.isIPv6() || addr.isIPv6Convertible()) {
                IPv6Address ipv6Addr = addr.toIPv6();
            }
            //use address
        } catch(AddressStringException e) {
            //e.getMessage has validation error
        }

1

জাভাতে, আপনি গ্রন্থাগার ক্লাসটি ব্যবহার করতে পারেন sun.net.util.IPAddressUtil:

IPAddressUtil.isIPv6LiteralAddress(iPaddress);

3
sun.net। * একটি ব্যক্তিগত API API
ডেভিড কোচার 13

1

নিয়মিত ভাব প্রকাশ করা কঠিন যা সমস্ত আইপিভি 6 ক্ষেত্রে কাজ করে। এগুলি সাধারণত বজায় রাখা শক্ত হয়, সহজে পাঠযোগ্য হয় না এবং কার্য সম্পাদনের সমস্যা তৈরি করতে পারে। সুতরাং, আমি একটি বিকল্প সমাধান ভাগ করতে চাই যা আমি বিকাশ করেছি: আইপিভি 6 এর জন্য নিয়মিত এক্সপ্রেশন (রেজেক্স) আইপিভি 4 থেকে পৃথক করুন

এখন আপনি জিজ্ঞাসা করতে পারেন যে "এই পদ্ধতিটি কেবলমাত্র IPv6 সন্ধান করে, আমি কীভাবে কোনও পাঠ্য বা ফাইলে IPv6 খুঁজে পেতে পারি?" এই সমস্যাটির জন্য এখানেও পদ্ধতি রয়েছে methods

দ্রষ্টব্য : আপনি .NET এ আইপিএড্রেস ক্লাস ব্যবহার করতে না চান, আপনি আমার পদ্ধতিতে এটি প্রতিস্থাপন করতে পারেন । এটি ম্যাপযুক্ত আইপিভি 4 এবং বিশেষ কেসগুলিও কভার করে, যখন আইপিএড্রেস কভার করে না।

class IPv6
{
    public List<string> FindIPv6InFile(string filePath)
    {
        Char ch;
        StringBuilder sbIPv6 = new StringBuilder();
        List<string> listIPv6 = new List<string>();
        StreamReader reader = new StreamReader(filePath);
        do
        {
            bool hasColon = false;
            int length = 0;

            do
            {
                ch = (char)reader.Read();

                if (IsEscapeChar(ch))
                    break;

                //Check the first 5 chars, if it has colon, then continue appending to stringbuilder
                if (!hasColon && length < 5)
                {
                    if (ch == ':')
                    {
                        hasColon = true;
                    }
                    sbIPv6.Append(ch.ToString());
                }
                else if (hasColon) //if no colon in first 5 chars, then dont append to stringbuilder
                {
                    sbIPv6.Append(ch.ToString());
                }

                length++;

            } while (!reader.EndOfStream);

            if (hasColon && !listIPv6.Contains(sbIPv6.ToString()) && IsIPv6(sbIPv6.ToString()))
            {
                listIPv6.Add(sbIPv6.ToString());
            }

            sbIPv6.Clear();

        } while (!reader.EndOfStream);
        reader.Close();
        reader.Dispose();

        return listIPv6;
    }

    public List<string> FindIPv6InText(string text)
    {
        StringBuilder sbIPv6 = new StringBuilder();
        List<string> listIPv6 = new List<string>();

        for (int i = 0; i < text.Length; i++)
        {
            bool hasColon = false;
            int length = 0;

            do
            {
                if (IsEscapeChar(text[length + i]))
                    break;

                //Check the first 5 chars, if it has colon, then continue appending to stringbuilder
                if (!hasColon && length < 5)
                {
                    if (text[length + i] == ':')
                    {
                        hasColon = true;
                    }
                    sbIPv6.Append(text[length + i].ToString());
                }
                else if (hasColon) //if no colon in first 5 chars, then dont append to stringbuilder
                {
                    sbIPv6.Append(text[length + i].ToString());
                }

                length++;

            } while (i + length != text.Length);

            if (hasColon && !listIPv6.Contains(sbIPv6.ToString()) && IsIPv6(sbIPv6.ToString()))
            {
                listIPv6.Add(sbIPv6.ToString());
            }

            i += length;
            sbIPv6.Clear();
        }

        return listIPv6;
    }

    bool IsEscapeChar(char ch)
    {
        if (ch != ' ' && ch != '\r' && ch != '\n' && ch!='\t')
        {
            return false;
        }

        return true;
    }

    bool IsIPv6(string maybeIPv6)
    {
        IPAddress ip;
        if (IPAddress.TryParse(maybeIPv6, out ip))
        {
            return ip.AddressFamily == AddressFamily.InterNetworkV6;
        }
        else
        {
            return false;
        }
    }

}

1

InetAddressUtilsসমস্ত নিদর্শন সংজ্ঞায়িত আছে। আমি সরাসরি তাদের প্যাটার্নটি ব্যবহার করে শেষ করেছি এবং রেফারেন্সের জন্য এটি এখানে এখানে আটকানো করছি:

private static final String IPV4_BASIC_PATTERN_STRING =
        "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" + // initial 3 fields, 0-255 followed by .
         "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"; // final field, 0-255

private static final Pattern IPV4_PATTERN =
    Pattern.compile("^" + IPV4_BASIC_PATTERN_STRING + "$");

private static final Pattern IPV4_MAPPED_IPV6_PATTERN = // TODO does not allow for redundant leading zeros
        Pattern.compile("^::[fF]{4}:" + IPV4_BASIC_PATTERN_STRING + "$");

private static final Pattern IPV6_STD_PATTERN =
    Pattern.compile(
            "^[0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){7}$");

private static final Pattern IPV6_HEX_COMPRESSED_PATTERN =
    Pattern.compile(
            "^(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)" + // 0-6 hex fields
             "::" +
             "(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)$"); // 0-6 hex fields 

1

রুবি ব্যবহার করছেন? এটা চেষ্টা কর:

/^(((?=.*(::))(?!.*\3.+\3))\3?|[\dA-F]{1,4}:)([\dA-F]{1,4}(\3|:\b)|\2){5}(([\dA-F]{1,4}(\3|:\b|$)|\2){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})\z/i

1

আপনার প্রয়োজনের উপর নির্ভর করে, একটি অনুমান যেমন:

[0-9a-f:]+

যথেষ্ট হতে পারে (যেমন সহজ লগ ফাইল গ্রেপিংয়ের মতো, উদাহরণস্বরূপ))


0

পিএইচপি 5.2+ এর জন্য ব্যবহারকারীরা filter_varদুর্দান্ত কাজ করে।

আমি জানি এটি আসল প্রশ্নের উত্তর দেয় না (বিশেষত একটি রেজেক্স সমাধান), তবে আমি ভবিষ্যতে অন্য কাউকে সহায়তা করতে পারে এই আশায় পোস্ট করছি।

$is_ip4address = (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== FALSE);
$is_ip6address = (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== FALSE);

0

এটি আইপিভি 4 এবং আইপিভি 6 এর জন্য কাজ করবে:

^(([0-9a-f]{0,4}:){1,7}[0-9a-f]{1,4}|([0-9]{1,3}\.){3}[0-9]{1,3})$

2
এটি 2 টি উদাহরণের সাথে অবৈধ ঠিকানার সাথে মেলে ::। উদাহরণস্বরূপ2404:6800::4003:c02::8a
nhahtdh

অবৈধ আইপিভি 4 666.666.666.666 এর সাথে মেলে
রায়ান উইলিয়ামস

0

আমি কিছুটা চেহারা এবং নামী গোষ্ঠী ব্যবহার করে এখানে কী নিয়ে এসেছি। এটি অবশ্যই কেবল আইপিভি 6, তবে আপনি আইপিভি 4 যুক্ত করতে চাইলে এটি অতিরিক্ত নিদর্শনগুলির সাথে হস্তক্ষেপ করা উচিত নয়:

(?=([0-9a-f]+(:[0-9a-f])*)?(?P<wild>::)(?!([0-9a-f]+:)*:))(::)?([0-9a-f]{1,4}:{1,2}){0,6}(?(wild)[0-9a-f]{0,4}|[0-9a-f]{1,4}:[0-9a-f]{1,4})


0

বর্গাকার বন্ধনী অন্তর্ভুক্ত একটি উত্স থেকে স্থানীয় স্থানীয়দের সাথে কেবল মিলছে। আমি জানি এটি এতটা বিস্তৃত নয় তবে জাভাস্ক্রিপ্টে অন্যান্য বিষয়গুলির প্রাথমিকভাবে কাজ না করার বিষয়গুলি সনাক্ত করতে অসুবিধা হয়েছিল, সুতরাং এটি আমার এখনকার জন্য যা প্রয়োজন তা পেয়েছে seems অতিরিক্ত রাজধানী এএফ প্রয়োজন হয় না।

^\[([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})\]

জিনকোর সংস্করণটি সরলীকৃত এবং আরও ভাল better


0

উপরে উল্লিখিত হিসাবে, আইপিভি 6 পাঠ্য উপস্থাপনা যাচাইকরণ বিশ্লেষণ পাওয়ার আরেকটি উপায় হ'ল প্রোগ্রামিং ব্যবহার করা। আরএফসি -২২৯১ এবং আরএফসি -৯৯৫২ এর সাথে সম্পূর্ণরূপে মেনে চলার একটি এখানে। আমি এএনএসআই সিতে এই কোডটি লিখেছি (জিসিসির সাথে কাজ করে, লিনাক্সে পরীক্ষা পাস করেছে - ঝাঁকুনির সাথে কাজ করে, ফ্রিবিএসডি পরীক্ষায় উত্তীর্ণ হয়েছে)। সুতরাং এটি কেবল এএনএসআই সি স্ট্যান্ডার্ড লাইব্রেরির উপর নির্ভর করে, তাই এটি সর্বত্র সংকলন করা যায় (আমি এটি ফ্রিবিএসডি সহ কার্নেল মডিউলের ভিতরে আইপিভি 6 পার্সিংয়ের জন্য ব্যবহার করেছি)।

// IPv6 textual representation validating parser fully compliant with RFC-4291 and RFC-5952
// BSD-licensed / Copyright 2015-2017 Alexandre Fenyo

#include <string.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

typedef enum { false, true } bool;

static const char hexdigits[] = "0123456789abcdef";
static int digit2int(const char digit) {
  return strchr(hexdigits, digit) - hexdigits;
}

// This IPv6 address parser handles any valid textual representation according to RFC-4291 and RFC-5952.
// Other representations will return -1.
//
// note that str input parameter has been modified when the function call returns
//
// parse_ipv6(char *str, struct in6_addr *retaddr)
// parse textual representation of IPv6 addresses
// str:     input arg
// retaddr: output arg
int parse_ipv6(char *str, struct in6_addr *retaddr) {
  bool compressed_field_found = false;
  unsigned char *_retaddr = (unsigned char *) retaddr;
  char *_str = str;
  char *delim;

  bzero((void *) retaddr, sizeof(struct in6_addr));
  if (!strlen(str) || strchr(str, ':') == NULL || (str[0] == ':' && str[1] != ':') ||
      (strlen(str) >= 2 && str[strlen(str) - 1] == ':' && str[strlen(str) - 2] != ':')) return -1;

  // convert transitional to standard textual representation
  if (strchr(str, '.')) {
    int ipv4bytes[4];
    char *curp = strrchr(str, ':');
    if (curp == NULL) return -1;
    char *_curp = ++curp;
    int i;
    for (i = 0; i < 4; i++) {
      char *nextsep = strchr(_curp, '.');
      if (_curp[0] == '0' || (i < 3 && nextsep == NULL) || (i == 3 && nextsep != NULL)) return -1;
      if (nextsep != NULL) *nextsep = 0;
      int j;
      for (j = 0; j < strlen(_curp); j++) if (_curp[j] < '0' || _curp[j] > '9') return -1;
      if (strlen(_curp) > 3) return -1;
      const long val = strtol(_curp, NULL, 10);
      if (val < 0 || val > 255) return -1;
      ipv4bytes[i] = val;
      _curp = nextsep + 1;
    }
    sprintf(curp, "%x%02x:%x%02x", ipv4bytes[0], ipv4bytes[1], ipv4bytes[2], ipv4bytes[3]);
  }

  // parse standard textual representation
  do {
    if ((delim = strchr(_str, ':')) == _str || (delim == NULL && !strlen(_str))) {
      if (delim == str) _str++;
      else if (delim == NULL) return 0;
      else {
        if (compressed_field_found == true) return -1;
        if (delim == str + strlen(str) - 1 && _retaddr != (unsigned char *) (retaddr + 1)) return 0;
        compressed_field_found = true;
        _str++;
        int cnt = 0;
        char *__str;
        for (__str = _str; *__str; ) if (*(__str++) == ':') cnt++;
        unsigned char *__retaddr = - 2 * ++cnt + (unsigned char *) (retaddr + 1);
        if (__retaddr <= _retaddr) return -1;
        _retaddr = __retaddr;
      }
    } else {
      char hexnum[4] = "0000";
      if (delim == NULL) delim = str + strlen(str);
      if (delim - _str > 4) return -1;
      int i;
      for (i = 0; i < delim - _str; i++)
        if (!isxdigit(_str[i])) return -1;
        else hexnum[4 - (delim - _str) + i] = tolower(_str[i]);
      _str = delim + 1;
      *(_retaddr++) = (digit2int(hexnum[0]) << 4) + digit2int(hexnum[1]);
      *(_retaddr++) = (digit2int(hexnum[2]) << 4) + digit2int(hexnum[3]);
    }
  } while (_str < str + strlen(str));
  return 0;
}

-1

এই ছোট ওয়ানলাইনারটি ব্যবহার করে দেখুন। এটি কেবল বৈধ সঙ্কুচিত / সংকুচিত IPv6 ঠিকানার সাথে মিলিত হওয়া উচিত (কোনও আইপিভি 4 সংকর নয়)

/(?!.*::.*::)(?!.*:::.*)(?!:[a-f0-9])((([a-f0-9]{1,4})?[:](?!:)){7}|(?=(.*:[:a-f0-9]{1,4}::|^([:a-f0-9]{1,4})?::))(([a-f0-9]{1,4})?[:]{1,2}){1,6})[a-f0-9]{1,4}/

প্রকৃতপক্ষে, বৈধ IPv6 ঠিকানার মধ্যে সংক্ষিপ্ত, সংকুচিত, সঙ্কুচিত-সংকর এবং সংকোচিত হাইব্রিড অন্তর্ভুক্ত রয়েছে। আইপিভি 6 ঠিকানার যে কোনও বৈধ পাঠ্য উপস্থাপনের সাথে আসলে আপনাকে যা মেলে তা তুলনায় এটি অনেক বেশি লাগে takes
রন মাউপিন

-2

রেজেক্স আইপিভি 4 অংশে নেতৃস্থানীয় শূন্যগুলি ব্যবহারের অনুমতি দেয়।

কিছু ইউনিক্স এবং ম্যাক ডিগ্রোসগুলি সেগমেন্টগুলিকে অক্টালে রূপান্তর করে।

আমি 25[0-5]|2[0-4]\d|1\d\d|[1-9]?\dআইপিভি 4 বিভাগ হিসাবে ব্যবহার করার পরামর্শ দিচ্ছি ।


-2

আপনি যদি কেবলমাত্র সাধারণ আইপি-গুলি চান (এখানে কোন স্ল্যাশ নেই):

^(?:[0-9a-f]{1,4}(?:::)?){0,7}::[0-9a-f]+$

আমি এটি হোস্ট ফাইল সম্পাদক অ্যাপ্লিকেশনটিতে আমার সিনট্যাক্স হাইলাইটারের জন্য ব্যবহার করি। কবজ হিসাবে কাজ করে।


এটি কোনওভাবেই শালীনভাবে কাজ করে না, এটিতে কোনও একক কোলনের সাথে এটি কোনও আইপিভি 6 ঠিকানার সাথে মেলে না, ....
কিলিয়ানডিএস

(?: [0-9a-f] {1,4} (? :::?)?), 0,7} ::? [0-9a-f] {1,4}
হ্যারি

তবুও ভুল, তবে তারপরেও আপনি জিনকো'র উত্তরটি পুনরাবৃত্তি করবেন, যা সাধারণ উদ্দেশ্যে যথেষ্ট ভাল, তবে এখনও ত্রুটি রয়েছে (ডাবল সংক্ষেপণ ধরা দেয় না এবং ডটেড কোয়াড, না লোকালহোস্ট বা :: সমাপ্তি, অনুমোদন দেয় না)। ..)
কিলিয়ানডিএস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.