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?
Odpowiedz
Można użyć /[a-z]/i
lub /[[:alpha:]]/
dobrze. W rzeczywistości \w
zawiera liczby, więc nawet nie zadziała.
Rozumiem, że 'i' sprawia, że nie jest w nim rozróżniana wielkość liter ? – keithjgrant
Zgadza się. – mkb
To jest po prostu niepoprawna odpowiedź. Czytaj poniżej. –
Być może masz na myśli /[[:alpha:]]/
? Zobacz perlre, aby omówić klasy znaków POSIX.
[^\W0-9_]
# or
[[:alpha:]]
See perldoc perlre
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 :)
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)
Zakres "[A-z]" zawiera wiele innych znaków. – NullUserException
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
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ć.
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. –
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. –
Po prostu użyj \p{L}
co oznacza "dowolną literę Unicode" i działa w Perlu (/\p{L}/
). Prawdopodobnie musisz use utf8;
.
'[A-Za-z]' nie koncentruje się na Ameryce, jest zorientowany na ASCII. – CanSpice
@CanSpice, powiedziałbym, że jest to centrum latynoskie, ponieważ ASCII używa tylko alfabetu łacińskiego. – Axeman
@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