2009-11-26 11 views
5

Muszę więc dopasować adres IPv6, który może lub nie może mieć maski. Niestety nie mogę po prostu użyć biblioteki do analizy ciągu.Jak mogę dopasować adresy IPv6 do wyrażenia regularnego Perla?

Bit maska ​​jest dość łatwe, w tym przypadku:

(?:\/\d{1,3})?$/ 

Najtrudniejsze jest różne formaty adresu IPv6. Trzeba dopasować :: wołowina, wołowina, wołowina :: :: wołowiny itp

an update: jestem prawie tam ..

/^(\:\:([a-f0-9]{1,4}\:){0,6}?[a-f0-9]{0,4}|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){0,6}?\:\:|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){1,6}?\:\:([a-f0-9]{1,4}\:){1,6}?[a-f0-9]{1,4})(\/\d{1,3})?$/i 

jestem, w tym przypadku ograniczony do korzystania z Perl regex.

+1

Czy to zadanie domowe? A może nie możesz skorzystać z biblioteki i co sprawia, że ​​mówisz, że jesteś ograniczony do "wyrażeń regularnych perla"? – innaM

+2

Językiem, którego używam, jest perl. Zmiany potrzebne do umożliwienia korzystania z innych bibliotek byłyby więcej pracy. Zdefiniować pracę domową? Jestem w domu i pracuję. Jest to jeden z projektów, nad którymi pracuję - jeśli masz na myśli edukację, to nie. – imnotneo

+6

"Zmiany potrzebne do umożliwienia korzystania z innych bibliotek byłyby więcej pracy." -- Wątpię. Przynajmniej nie na dłuższą metę. Mówiąc ogólnie, Perl bez użycia modułów z CPAN to tylko połowa języka. Odmawianie nawet korzystania z prostych czystych modułów Perla, a następnie proszenie innych o rozwiązania wcześniej rozwiązanych problemów wydaje się ... nieskuteczne. – tsee

Odpowiedz

13

zawiera łatkę do Regexp :: Common demonstrującą pełne, dokładne i przetestowane wyrażenie regularne IPv6. Jest to proste tłumaczenie gramatyki IPv6. Regexp::IPv6 jest również dokładny.

Co ważniejsze, zawiera pakiet testowy. Uruchamianie go za pomocą twojego regex pokazuje, że wciąż jesteś daleko. 10 z 19 pominiętych. 1 na 12 fałszywych alarmów. Protokół IPv6 zawiera wiele specjalnych skrótów, dzięki czemu bardzo łatwo można uzyskać subtelne błędy.

Najlepszym miejscem do przeczytania na temat adresu IPv6 jest RFC 3986 sekcja 3.2.2.

+0

Ktoś wie, czy istnieje wersja tego Pythona? – jcollie

+0

@jcollie Te wyrażenia regularne nie używają żadnych zabawnych funkcji Perla. Powinny być tłumaczeniem na język Python. – Schwern

5

Nie jestem ekspertem IPv6, ale proszę uwierzcie mi, kiedy mówię, że dopasowanie (nie mówiąc już o sprawdzaniu poprawności) adresy IPv6 nie są łatwe z bardzo prostym wyraże- niem, takim jak ten, który sugerujesz. Istnieje wiele skrótów i różnych konwencji dotyczących łączenia adresu z portem, by wymienić tylko przykład. Jednym z takich skrótów jest to, że można pisać 0: 0: 0: 0: 0: 0: 0: 1 jako :: 1, ale jest ich więcej. Jeśli czytasz niemiecki, proponuję przejrzeć slajdy Steffen Ullrich's talk na 11. niemieckim warsztacie Perla.

Mówisz, że nie możesz korzystać z biblioteki, ale jeśli chcesz odkryć całą złożoność biblioteki, możesz równie dobrze zaimportować ją dosłownie do projektu.

10

Co masz na myśli, że nie możesz po prostu użyć biblioteki? A co z modułem? Regexp::IPv6 da ci to, czego potrzebujesz.

1

Jeśli potrzebujesz w ryzach perl jeśli ciąg jest adres IPv6 można spróbować to:

if (/(([\da-f]{0,4}:{0,2}){1,8})/i) { print("$1") }; 
2

to przeważnie działa ...

^([0-9a-fA-F]{0,4}|0)(\:([0-9a-fA-F]{0,4}|0)){7}$ 

Wady: :: jak przypadkach nie obsługiwane prawidłowo

0

tutaj jest jeden pracował dla wszystkich przykładów IPv6 mam udało się znaleźć:

/^\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]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){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]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){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]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){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]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){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]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/ 

upewnij się, że to jedna linia przed użyciem. to stwierdzono tutaj:

https://community.helpsystems.com/forums/intermapper/miscellaneous-topics/5acc4fcf-fa83-e511-80cf-0050568460e4

weryfikowana na wszystkich przykładach od strony pytaniu strony społeczności i miejscu wikipedia stąd:

https://en.wikipedia.org/wiki/IPv6

narzędzie do weryfikacji używany ten tutaj:

https://regex101.com/

Powiązane problemy