2013-04-19 10 views
6

Na przykład skonfigurować te:Jak napisać wyrażenie regularne dla niemieckich klas postaci, takich jak litery, samogłoski i spółgłoski?

L = /[a-z,A-Z,ßäüöÄÖÜ]/ 
V = /[äöüÄÖÜaeiouAEIOU]/ 
K = /[ßb-zBZ&&[^#{V}]]/ 

tak że /(#{K}#{V}{2})/ mecze "ßäÜ" w "azAZßäÜ".

Czy istnieją lepsze sposoby radzenia sobie z nimi?

Czy mogę umieścić te stałe w module w pliku gdzieś w moim folderze instalacji Ruby, więc mogę dołączyć/wymagać ich w dowolnym nowym skrypcie, który piszę na moim komputerze? (Jestem newbie i wiem, że muddling tej terminologii, proszę mnie poprawić).

Ponadto mogę dostać tylko meta-znaki \L, \V i \K (lub cokolwiek nie jest już określone w Ruby), aby stać za nimi w wyrażeniach regularnych, więc nie muszę przez cały czas wykonywać tej interpolacji ciągów znaków?

+2

Twoje podejście wydaje się całkiem rozsądne. możesz skrócić K tak: '/ [ßb-zB-Z && [^ aeiouAEIOU]] /' jeśli chcesz. –

+0

Och dzięki, dobrze wiedzieć, mogę użyć tej składni! ^^ –

+0

Twój "moduł w folderze instalacyjnym" to prawdziwy klejnot. Więcej informacji można znaleźć na stronie http://guides.rubygems.org/. – knut

Odpowiedz

1

Zaczynasz całkiem dobrze, ale musisz przejrzeć kod klasy Regexp, który jest instalowany przez Ruby. Istnieją triki do pisania wzorów, które budują się za pomocą interpolacji String. Piszemy cegły i pozwalamy Ruby budować ściany i dom za pomocą normalnych trików String, a następnie przekształcać wynikowe ciągi w prawdziwe wystąpienia Regexp do wykorzystania w kodzie.

Na przykład:

LOWER_CASE_CHARS = 'a-z' 
UPPER_CASE_CHARS = 'A-Z' 
CHARS = LOWER_CASE_CHARS + UPPER_CASE_CHARS 
DIGITS = '0-9' 

CHARS_REGEX = /[#{ CHARS }]/ 
DIGITS_REGEX = /[#{ DIGITS }]/ 

WORDS = "#{ CHARS }#{ DIGITS }_" 
WORDS_REGEX = /[#{ WORDS }]/ 

zachować budynek z małych znaków atomowych i klas postaci, a wkrótce będziesz miał duże wyrażeń regularnych. Spróbuj wkleić je jeden po drugim do IRB, a szybko to zrozumiesz.

0

Niewielkim ulepszeniem tego, co teraz zrobisz, byłoby użycie regex unicode support for categories or scripts.

Jeśli masz na myśli, że L jest literą, użyj \p{L}. Lub użyj \p{Latin}, jeśli chcesz, aby oznaczała dowolną literę w alfabecie łacińskim (wszystkie litery są).

Nie sądzę, że są wbudowane samogłoski i spółgłoski.

Zobacz \p{L}match your example.