2009-04-04 10 views
8

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

+1

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 –

+0

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

+0

możliwy duplikat [Wykonywanie wyrażeń regularnych w strumieniu] (http://stackoverflow.com/questions/3013669/performing-regex-on-a-stream) –

Odpowiedz

0

Konwersja strumienia na tablicę bajtów.

+0

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! –

-2

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ą.

+8

-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ą. –

+0

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. –

+0

+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. –

9

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.

+1

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

0

Spróbuj użyć Ragel - narzędzie do wyrażeń regularnych z wywoływanymi zwrotami.

Może być stosowany do strumieni i fragmentów.

Powiązane problemy