2010-04-17 11 views
5

Byłoby wspaniale mieć wygodny sposób przechowywania wzorców z pojedynczym ukośnikiem odwrotnym. Niektóre obejścia: zapisz je w pliku i użyj NIO do czytania. Wady: Java EE nie pozwala na dostęp do IO. Przechowuj jakoś w JNDI. Może nowa flaga java 5 Pattern.LITERAL może pomóc? Chcę pracować z normalnym ciągiem znaków, takim jak \d, a nie \\d.Wzory Java Regexp mają podwójne ukośniki odwrotne, jak przechowywać wzorce w czytelnym formacie.

+2

ustalono: jest to ból –

+0

Należy zauważyć, że nie ma to nic wspólnego z regex w szczególności; znak ukośnika odwrotnego we WSZYSTKICH literałach łańcuchowych w Javie zapisuje się jako \\. – polygenelubricants

Odpowiedz

6

Problem polega na tym, że \ jest specjalnym znakiem w języku Java podczas tworzenia łańcucha znaków, niezależnie od wyrażeń regularnych.

np String s = "\t";

nie można użyć tego dla dowolnych znaków choć String s = "\a"; daje błąd kompilacji. Poprawne znaki są b, t, n, f, r,”, 'i \

zatem uzyskać dosłowne \ w ciągu w Javie trzeba uciec tak:. \\ dlatego, twój tylko opcja NIE ma tych ciągów w plikach Java, dlatego w zewnętrznym pliku ładowanym przez plik Java. Pattern.LITERAL nie pomoże w ogóle, ponieważ wciąż potrzebujesz poprawnego łańcucha java, którego nie ma \d.

0

Jeśli pracujesz tylko w Javie, radzę nie spocić się. Po prostu przechowuj wyrażenie regularne, ponieważ Java może je zrozumieć, czyli z denerwującym podwójnym \.

JEŻELI i TYLKO JEŚLI chcesz zapisać wyrażenie regularne, aby użyć ich jako pliku wejściowego dla różnych języków, a następnie utwórz plik tekstowy, używając standardowej notacji regularnej. Ale wtedy będziesz musiał stworzyć jakąś klasę, która będzie używała char przez czytanie znaku i sama zajmie się znakami przed dodaniem ich do ciągu, który ma być użyty w macierzy wzoru.

to dużo pracy (właściwie nie za dużo, ale niech to diabli, jeśli to nie będzie dziwaczne), ale musisz zrobić to tylko raz, a możesz rozszerzyć to na wiele języków, byłoby dobrze doświadczenie w nauce w mojej opinii. Zrób to źle, a będziesz cierpieć z powodu debugowania małego drania.

Może być miłym, jeśli nie życiowym dodatkiem do Javy, jakaś flaga, która pozwala, aby tekst z pliku był odczytywany bezpośrednio jako standardowy łańcuch regex, który sam wprowadzałby niezbędne zmiany. Muszę sprawdzić, czy ktoś zasugerował tę funkcję.

PS: Właśnie zauważyłem, że tutaj trzeba uciec \ aby był on widoczny ... to dziwne ...

+1

Nie trzeba pisać kodu, aby uniknąć ukośników odwrotnych, jeśli czytasz go z pliku. Dodatkowe ukośniki odwrotne służą do przechodzenia w składni * java *. –

+1

@Dilum ma rację: wszystkie podwójne ucieczki są potrzebne tylko wtedy, gdy regex zostanie utworzony * w kodzie źródłowym Java *, jako literały String. Jeśli czytasz to z innego miejsca, np. Pliku lub pola JTextField, nie jest konieczne dodatkowe przechodzenie. Powodem, dla którego nie widzisz tego problemu w większości innych języków jest to, że oferują one zarówno regex literały, jak i surowe/dosłowne/nieinterpolujące ciągi literowe (lub oba). –

+0

Przy okazji, możesz użyć cofnięć lub wcięcia, aby sformatować kod w swoich postach, więc nie musisz (na przykład) ukrywać ukośników.Możesz edytować swoją odpowiedź, aby zobaczyć, jak to zrobiłem. Naciśnij pomarańczowy przycisk "Pomoc" nad polem tekstowym, aby uzyskać więcej opcji. –

0

Jeśli jesteś zainteresowany przeczytaniem wyrażenia z pliku, należy rozważyć pakowania plik wewnątrz jar i użycie Class.getResourceAsStream(...). AFAIK, który jest nadal dozwolony w Java EE.

Powiązane problemy