Poszukuję przykładu zastosowania wyrażenia regularnego do strumienia we/wy Java, który nie po prostu przekształca strumień w ciąg znaków, ponieważ chciałbym zachować dane binarne. Większość przykładów w Internecie koncentruje się na danych tekstowych ...Stosowanie wyrażenia regularnego do strumienia we/wy Java
Odpowiedz
Konwersja strumienia na tablicę bajtów.
Należy wspomnieć, że ma to sens tylko w przypadku, gdy dane wejściowe mogą być załadowane do pamięci zarówno pod względem wielkości, jak i czasu potrzebnego na załadowanie! Oznacza to, że musisz znać długość danych dostarczanych przez strumień w celu napisania wiarygodnego programu. Znajomość długości wejściowej strumienia jest sprzeczna z jego celem dostarczenia potencjalnie nieskończonych danych! –
Operacje Regex muszą być wykonywane na łańcuchach, które są zakodowanymi bajtami danych binarnych. Nie możesz wykonywać operacji wyrażeń regularnych na bajtach danych, których nie masz pojęcia, co reprezentują.
-1 Nie zgadzam się. Nie ma powodu, dla którego nie można zastosować wyrażeń regularnych do danych binarnych. Dane binarne nie oznaczają, że nie masz pojęcia, co reprezentują. –
Podobno można wziąć strumień 0 i 1 i wykonać regex na nim. Jednak żaden z istniejących interfejsów API Java nie zapewnia dostępu do tego nieprzetworzonego strumienia, bez przekształcania go w coś bardziej znaczącego. –
+1 zgadzam się, stosowanie wyrażenia regularnego na danych binarnych nie ma sensu. Regeksy są zasadniczo ukierunkowane na ciągi znaków, są one definiowane za pomocą ciągów znaków, więc zawsze będziesz używać kodowania ciągów znaków jawnie lub niejawnie. –
Wymagana funkcjonalność nie występuje w Java Standard. Będziesz musiał użyć klasy jakarta regexp, a konkretnie klasy StreamCharacterIterator. Ta klasa zawiera obiekt InputStream do użycia w operacjach wyrażeń regularnych.
Jeśli chcesz użyć standardowego pakietu wyrażeń regularnych, proponuję pobrać źródło z poprzedniej klasy here i zmienić umowę, wprowadzając CharSequence zamiast CharacterIterator.
Jednym z problemów z implementacją CharSequence jest to, że interfejs wymaga, aby klasa implementowała "public int length()". Jeśli czytasz ze strumienia, nie będziesz znać długości i nie będzie mógł zwrócić odpowiedzi do silnika regex. – monkeysplayingpingpong
Spróbuj użyć Ragel - narzędzie do wyrażeń regularnych z wywoływanymi zwrotami.
Może być stosowany do strumieni i fragmentów.
- 1. Java: Uzyskiwanie tablicę każdy ciąg, który pasuje do wyrażenia regularnego
- 2. Automatyczne łączenie wyrażenia regularnego
- 3. Minimalna długość wyrażenia regularnego
- 4. Jak użyć wyrażenia regularnego do dopasowania nazwy?
- 5. Lista wszystkich słów pasujących do wyrażenia regularnego
- 6. pasuje do wyrażenia regularnego z opcjonalnym uprzedzona
- 7. Anulowanie długo działającego dopasowania do wyrażenia regularnego?
- 8. Jak utworzyć ciąg pasujący do wyrażenia regularnego?
- 9. Dodawanie specjalnego znaku do wyrażenia regularnego?
- 10. Dopasuj zapytanie do wyrażenia regularnego w SQL?
- 11. zabezpieczone hasłem z wyrażenia regularnego
- 12. Jak sprawdzić poprawność wyrażenia regularnego?
- 13. Znaczenie części wyrażenia regularnego perla?
- 14. Wyjaśnienie wyrażenia regularnego dla vim
- 15. Jak używać wyrażenia regularnego w ścieżce klasy clas java?
- 16. Konwersja wyrażenia regularnego JavaScript na składnię Javy
- 17. Programowe wyprowadzenie wyrażenia regularnego z ciągu znaków
- 18. Czy odczytać plik, używając wyrażenia regularnego?
- 19. Opcjonalne parametry w bash wyrażenia regularnego
- 20. generowanie wyrażenia regularnego z ciągu znaków
- 21. sed: nie można rozwiązać tego wyrażenia regularnego
- 22. Wyodrębnianie ciągów statycznych z wyrażenia regularnego
- 23. dostać tylko cyfry przy użyciu wyrażenia regularnego
- 24. Problem z wydajnością wyrażenia regularnego Javy
- 25. Tworzenie wszystkich możliwych dopasowań wyrażenia regularnego
- 26. test nazwa pliku z wyrażenia regularnego
- 27. Wygeneruj wszystkie prawidłowe wartości dla wyrażenia regularnego.
- 28. Podziel ciąg na podstawie wyrażenia regularnego
- 29. Mecz na wielu liniach perl wyrażenia regularnego
- 30. Zwracam tylko część dopasowania z wyrażenia regularnego
Czego szukasz? Odrzucić dane, które nie pasują do wyrażenia regularnego? I na co chcesz się dopasować, jeśli nie interesują Cię struny? Niektóre wyjaśnienia byłyby dobre –
Tylko dla wyjaśnienia: Konwersja znaków i powrót do danych binarnych może mieć wpływ na wydajność, ale żaden bajt nie zostanie utracony z powodu konwersji. – rwitzel
możliwy duplikat [Wykonywanie wyrażeń regularnych w strumieniu] (http://stackoverflow.com/questions/3013669/performing-regex-on-a-stream) –