2011-02-04 12 views
5

Próbuję dopasować znak kontrolny w postaci \^c, gdzie c jest dowolnym poprawnym znakiem dla znaków kontrolnych. Mam to wyrażenie regularne, ale obecnie nie działa: \\[^][@-z]Co to jest wyrażenie regularne dla znaków kontrolnych?

Myślę, że problem polega na tym, że znak karetki (^) jest częścią mechanizmu analizowania wyrażeń regularnych.

+0

To nie ma dla mnie sensu. Czy jest tam backslash? Czy te prawdziwe znaki kontrolne lub niektóre sekwencje ASCII sugerują to samo? Dlaczego warto wybrać tylko \ c @ .. \ cZ? Są inni, wiesz. – tchrist

+0

Dlaczego umieszczasz karetkę w klasie postaci? –

+0

Próbuję dopasować literalny tekst do znaków sterujących, a nie do samych znaków kontrolnych. –

Odpowiedz

7

Dopasuj ciąg tekstowy ASCII formularza ^X, używając wzoru \^., nic więcej. Dopasuj ciąg tekstowy ASCII w postaci \^X z wzorcem \\\^.. Możesz ograniczyć tę kropkę do [[email protected]_\[\]^\\], czyli \\\^[[email protected]_\[\]^\\]. Łatwiej jest odczytać jako [?\x40-\x5F] dla kategorii znaków w nawiasach kwadratowych, stąd \\\^[?\x40-\x5F] dla literalnego BACKSLASH, po którym następuje literalny CIRCUMFLEX, a następnie coś, co zmienia się w jeden z ważnych znaków kontrolnych.

Należy pamiętać, że jest to wynikiem drukowania wzoru lub tego, co przeczytałeś z pliku. To jest to, co musisz przekazać do kompilatora regex. Jeśli masz go jako literał ciąg, musisz oczywiście podwoić każdy z tych ukośników. `\\\\\\^[?\\x40-\\x5F]" Tak, to jest szalenie wyglądające, ale to dlatego, że Java nie obsługuje wyrażeń regularnych bezpośrednio jako Groovy i Scala - lub Perl i Ruby - do. Praca Regex jest zawsze łatwiejsza bez dodatkowych bbaaccksslllllaasshessesssess. :)

Jeśli dysponujesz prawdziwymi znakami kontrolnymi zamiast pośrednich ich reprezentacji, użyjesz \pC dla wszystkich dosłownych punktów kodowych z właściwością GC = Inny lub \p{Cc} dla GC = Kontrola.

+0

Nie jestem całkiem pewien, że rozumiem \ pC. Piszę leksykalny analizator używając JLex i muszę rozpoznać prawidłowe ciągi znaków kontrolnych w ciągu i przetłumaczyć je na ich odpowiedniki ASCII. Na przykład ciąg "\^g" wydrukuje znak dzwonka lub spowoduje, że głośnik komputera wyda dźwięk. Potrzebuję wyrażeń regularnych, aby dopasować sekwencje znaków kontrolnych, takie jak "\^g". –

+0

@pcman: Czy masz literalną BACKSLASH, po której następuje literalna CIRCUMFLEX, a następnie znak, który jest jednym z '[A-Z @? \ [\] _ ^]'? – tchrist

+0

Tak, próbuję dopasować tekst dosłowny tak, jak będzie wyglądał w ciągu znaków. –

Powiązane problemy