2010-09-20 15 views
12

Naprawdę chciałbym użyć \ w ale pasuje również do podkreśleń, więc wybieram [A-Za-z], który jest niepotrzebnie gęsty i skoncentrowany na Ameryce. Czy jest lepszy sposób to zrobić? Coś takiego jak [\ w^_] (wątpię, czy mam właściwą składnię)?Jaki jest najlepszy sposób dopasowania tylko liter w wyrażeniu regularnym?

+4

'[A-Za-z]' nie koncentruje się na Ameryce, jest zorientowany na ASCII. – CanSpice

+0

@CanSpice, powiedziałbym, że jest to centrum latynoskie, ponieważ ASCII używa tylko alfabetu łacińskiego. – Axeman

+1

@Axeman, Źródła? W AFAIK wiele języków pochodnych łacińskich podkreśliło samogłoski i litery. [A-Za-z] nie będzie pasować ani do Español, ani do Française. Nawet czysty łaciński ma Æ glif, który nie jest wewnątrz ASCII. O której łacinie mówisz? – Kyordhel

Odpowiedz

7

Można użyć /[a-z]/i lub /[[:alpha:]]/ dobrze. W rzeczywistości \w zawiera liczby, więc nawet nie zadziała.

+1

Rozumiem, że 'i' sprawia, że ​​nie jest w nim rozróżniana wielkość liter ? – keithjgrant

+0

Zgadza się. – mkb

+1

To jest po prostu niepoprawna odpowiedź. Czytaj poniżej. –

15

Być może masz na myśli /[[:alpha:]]/? Zobacz perlre, aby omówić klasy znaków POSIX.

+1

Nadal nie sądzę, że bierze to pod uwagę znaki międzynarodowe, ponieważ ': alpha:' jest nadal 'a-zA-Z' – vol7ron

+0

Myliłem się; perldocs powinny być aktualizowane. Jednak zawiera dodatkowe znaki interpunkcyjne: ''"'ˎˏːˑˬˮ' – vol7ron

+0

@ vol7tron: Twój komentarz jest nieszczelny ... –

1

szukasz internacjonalizacji w swoim regex? Pokochasz więc trzeba zrobić coś jak ten facet zrobił: JavaScript validation issue with international characters

wyraźnie zgadza się na wszystkie litery językowych księżyca :)

+0

Nie widzę żadnych księżycowych liter w tym regexie, ale może to być po prostu dlatego, że czytam je w świetle dziennym. – mkb

+0

Kiedy je zobaczysz, powinieneś wyć – vol7ron

4

kilka możliwości:

1. /[a-z]/i    # case insensitive 
2. /[A-Z]/i    # case insensitive 
3. /[A-z]/    # explicit range listing (capital 'A' to lowercase 'z') 
4. /[[:alpha:]]/   # POSIX alpha character class 

Polecam używanie obu przypadku - niewrażliwy lub prawdziwy sposób, chyba że masz na myśli pewną preferencję językową.

Uwaga:

  • Numer 3 wymaga kapitału 'A', a potem mała litera 'Z' z powodu kolejności wartości ASCII; to nie działa, jeśli wykonasz odwrotną stronę: a-Z. Ponadto: ta metoda nie spełni kryteriów braku podkreślenia, ponieważ zawiera ona[\]^_ `.
  • Numer 4 będzie pasował na tych dodatkowych znaków językowych, ale także odpowiedzią na:
    ʹʺʻˍˎˏːˑˬˮ̀́   (plus wiele innych)
+0

Zakres "[A-z]" zawiera wiele innych znaków. – NullUserException

+0

Masz rację, jest kilka nawiasów i dodatkowych znaków, które złamałyby kryteria braku podkreślenia. Zmodyfikowałem odpowiedź. @flies, tak, ale byłem niepoprawny. Naprawdę pierwsze dwie są tą samą metodą, pokazując tylko, że możesz użyć różnych danych wejściowych. – vol7ron

8

Dopasowane międzynarodowych (czyli nie-ASCII) znaków jest trochę trudne, a może zależy od wielu rzeczy. Sprawdź ten przykład:

#!perl -w 

use strict; 
use utf8; 

my $string = "ä"; 

print "matched :alpha:\n" if $string =~ /[[:alpha:]]/; 
print "matched ^\\W0-9_\n" if $string =~ /[^\W0-9_]/; 
print "matched [a-zA-Z]\n" if $string =~ /[a-zA-Z]/; 
print "matched [a-z]i\n" if $string =~ /[a-z]/i; 
print "matched [A-z]\n" if $string =~ /[A-z]/; 

Dla mnie to skutkuje

matched :alpha: 

Jeśli usuniesz use utf8 żaden z regularnych wyrażeń meczu.

Patrząc na this very relevant question, wygląda na to, że prawdopodobnie chcesz use utf8 i sprawdź Unicode::Semantics.

Oczywiście, jeśli używasz prostych znaków ASCII niż którykolwiek z wyżej wymienionych wyrażeń regularnych będzie działać.

+0

Musisz być ostrożny przy \ w i \ W w Perlu. Ostatnio jest to trochę ruchomy cel, więc nie będę zależał od jego definicji. –

+0

To, co twój edytor wyświetla jako "ä", może nie być literą w Perlu. "ä" = "\ xE4" nie jest zdefiniowany w zestawie znaków ASCII, domyślnie Perl użyje klas znaków ASCII dla łańcucha, który nie jest zakodowany jako UTF8. Dodanie 'use utf8;' potraktuje twój kod źródłowy jako UTF8 i uczyni "ä" ciągiem Unicode. W zestawie znaków Unicode "ä" jest znakiem alfabetu. Porównaj '$ string =" ä ";' vs '$ string = decode (" iso-8859-1 "," ä ");' bez 'use utf8;'. W pierwszym przypadku Perl zobaczy dane binarne, w drugim dane binarne będą interpretowane jako Latin-1 i konwertowane na UTF-8. –

11

Po prostu użyj \p{L} co oznacza "dowolną literę Unicode" i działa w Perlu (/\p{L}/). Prawdopodobnie musisz use utf8;.

Powiązane problemy