Jaka jest twoja definicja characters? ASCII? Kanji? ISO-XXXX-X? UTF8?
Ivo Wetzel
45
Jaka jest twoja definicja regex? Perl? Emacs? Grep?
Pascal Cuoq,
4
Biorąc pod uwagę, że pytanie jest w języku angielskim, na angielskiej stronie internetowej można założyć, że pytanie dotyczy znaków w języku angielskim.
vaer-k
1
Zauważyłem, że \ p {L} dla litery i flagi / u dla Unicode pasuje do dowolnej litery w moim wyrażeniu regularnym, tj./\p{L}+/u
MaxZoom,
4
Given that the question is in English, on an English site, it's fair to assume the question regards characters in English. To prawda. Jak wszyscy wiemy, anglojęzyczni NIGDY nie lokalizują swoich aplikacji!
Alex
Odpowiedzi:
392
Użyj zestawu znaków: [a-zA-Z]dopasowuje jedną literę od A – Z małymi i dużymi literami. [a-zA-Z]+dopasowuje jedną lub więcej liter i ^[a-zA-Z]+$dopasowuje tylko ciągi, które składają się z jednej lub więcej liter (^ i$ zaznaczają początek i koniec łańcucha).
Jeśli chcesz, aby dopasować inne litery niż-Z, można je dodać do zestawu znaków: [a-zA-ZäöüßÄÖÜ]. Lub używasz predefiniowanych klas znaków, takich jak klasa właściwości znaków Unicode,\p{L} która opisuje znaki Unicode, które są literami.
To bardzo skoncentrowane na ASCII rozwiązanie. Spowoduje to uszkodzenie praktycznie dowolnego tekstu w języku innym niż angielski.
Joachim Sauer
7
@Jachach Sauer: Będzie raczej łamał się na językach, używając znaków spoza alfabetu łacińskiego.
Gumbo,
15
Łama już 90% tekstu niemieckiego, nie wspominając nawet o francuskim czy hiszpańskim. Włoski może nadal dobrze sobie radzić.
Ivo Wetzel,
9
zależy to od tego, jaką definicję „charakteru łacińskiego” wybierzesz. J, U, Ö, Ę można argumentować, że są znakami łacińskimi lub nie, zgodnie z twoją definicją. Ale wszystkie są używane w językach, w których do pisania używany jest „alfabet łaciński”.
Joachim Sauer
9
\ p {L} pasuje do wszystkich akcentów umlautów sedilli itp., więc powinieneś to zrobić.
Radu Simionescu,
198
\p{L} dopasowuje wszystko, co jest literą Unicode, jeśli interesują Cię alfabety inne niż łacińskie
nie we wszystkich odmianach wyrażeń regularnych. Na przykład wyrażenia regularne vim traktują \pjako „znak do wydruku”.
Philip Potter
3
ta strona sugeruje tylko obsługę wyrażeń regularnych Java, .net, perl, jgsoft, XML i XPath \ p {L}. Ale najważniejsze pominięcia: python i ruby (chociaż python ma moduł regex).
Philip Potter
6
@Pilil Potter: Ruby obsługuje właściwości znaków Unicode przy użyciu tej samej składni.
Jörg W Mittag
6
Myślę, że powinno to \p{L}\p{M}*+dotyczyć listów składających się z wielu współrzędnych kodowych, np. Litery poprzedzającej znaki akcentujące. Jak na regular-expressions.info/unicode.html
Miałem na myśli litery. Wygląda na to, że nie działa. preg_match ('/ [a-zA-Z] + /', $ name);
Nike
[A-Za-z] to tylko deklaracja znaków, których możesz użyć. Nadal musisz zadeklarować, ile razy należy użyć tej deklaracji: [A-Za-z] {1,2} (aby dopasować 1 lub 2 litery) lub [A-Za-z] {1, *} (aby dopasować 1 lub więcej liter)
@phuclv: Rzeczywiście, ale to zależy od kodowania, a kodowanie jest częścią ustawień programu (domyślna konfiguracja lub ta zadeklarowana w pliku konfiguracyjnym programu). Kiedy pracowałem nad różnymi językami, zapisywałem to na stałe w pliku konfiguracyjnym.
Catalina Chircu
1
Kodowanie @CatalinaChircu jest tutaj absolutnie nieistotne. Kodowanie to sposób na zakodowanie punktu kodowego w zestawie znaków w formacie binarnym, na przykład UTF-8 jest kodowaniem dla Unicode. Litery OTOH zależą od języka, a jeśli ktoś mówi, że [A-Za-z]są literami, należy określić język, który jest używany
phuclv 15.10.19
32
Najbliższa dostępna opcja to
[\u\l]+
który pasuje do sekwencji wielkich i małych liter. Jednak nie jest obsługiwany przez wszystkie edytory / języki, więc korzystanie z niego jest prawdopodobnie bezpieczniejsze
Wyrażenie regularne, które kilka osób napisało jako „/ ^ [a-zA-Z] $ / i” jest niepoprawne, ponieważ w końcu wspomniały / i, które nie rozróżnia wielkości liter i po dopasowaniu po raz pierwszy wróci. Zamiast / używam po prostu / g, który jest globalny, a ty nie musisz umieszczać ^ $ na początku i na końcu.
/[a-zA-Z]+/g
[a-z _] + pasuje do pojedynczego znaku na poniższej liście
Kwantyfikator: + Od jednego do nieograniczonego czasu, tyle razy, ile to możliwe, zwracając w razie potrzeby
az pojedynczy znak z zakresu od a do z (rozróżnia małe i duże litery)
AZ pojedynczy znak z zakresu od A do Z (rozróżnia małe i wielkie litery)
modyfikator g : globalny. Wszystkie mecze (nie wracaj przy pierwszym meczu)
\wmoże nie być dobrym rozwiązaniem we wszystkich przypadkach. Przynajmniej w PCRE,\w może również pasować do innych postaci. Cytując instrukcję PHP : Znak „słowo” to dowolna litera lub cyfra lub znak podkreślenia, czyli dowolny znak, który może być częścią „słowa” Perla. Definicja liter i cyfr jest kontrolowana przez tabele znaków PCRE, i mogą się różnić, jeśli ma miejsce dopasowanie specyficzne dla ustawień narodowych. Na przykład w ustawieniach narodowych „fr” (francuski) niektóre litery znaków większe niż 128 są używane dla liter akcentowanych i są dopasowywane przez \ w. ”.
Amal Murali
słowa zawierają inne znaki z liter
V-SHY
2
\woznacza dopasuj litery i cyfry
Eugen Konkov
4
Jeśli masz na myśli jakiekolwiek litery w jakimkolwiek kodowaniu znaków, dobrym rozwiązaniem może być usunięcie nieliterowych znaków, takich jak spacje \s, cyfry \di inne znaki specjalne, takie jak:
[!@#\$%\^&\*\(\)\[\]:;'",\. ...more special chars... ]
Lub użyj negacji powyższej negacji, aby bezpośrednio opisać dowolne litery:
\S \D and[^..special chars..]
Plusy:
Działa ze wszystkimi smakami wyrażeń regularnych.
Łatwy do napisania, czasem oszczędza dużo czasu.
Cons:
Długie, czasem nie idealne, ale kodowanie znaków również może zostać złamane.
[^\W|\d]znaczy nie \Wi nie |i nie \d. Ma ten sam efekt netto, ponieważ |jest częścią, \Wale |nie działa tak, jak myślisz. Nawet wtedy oznacza to, że akceptuje _postać. Prawdopodobnie szukasz[^\W\d_]
OGHaza,
Zgadzam się z tobą, akceptuje _. Ale „NIE” |jest równe „I”, więc [^\W|\d]oznacza: NIE \WI NIE\d
Motlab
12
[^ab]znaczy nie ai nie b. [^a|b]znaczy nie ai nie |i nie b. Aby dać drugi przykład [a|b|c|d]jest dokładnie taka sama jak [abcd|||]która jest dokładnie taka sama, jak [abcd|]- z których wszystkie są równe jest dosłowny charakter, a nie operator OR. Operator OR jest sugerowany między każdym znakiem w klasie znaków, co oznacza, że klasa ma akceptować znak (potok). ([a]|[b]|[c]|[d]|[|])|||
OGHaza
1
Ostatnio używałem tego wzoru w swoich formularzach do sprawdzania nazwisk osób, zawierających litery, spacje i znaki specjalne, takie jak znaki akcentujące.
characters
? ASCII? Kanji? ISO-XXXX-X? UTF8?regex
? Perl? Emacs? Grep?/\p{L}+/u
Given that the question is in English, on an English site, it's fair to assume the question regards characters in English.
To prawda. Jak wszyscy wiemy, anglojęzyczni NIGDY nie lokalizują swoich aplikacji!Odpowiedzi:
Użyj zestawu znaków:
[a-zA-Z]
dopasowuje jedną literę od A – Z małymi i dużymi literami.[a-zA-Z]+
dopasowuje jedną lub więcej liter i^[a-zA-Z]+$
dopasowuje tylko ciągi, które składają się z jednej lub więcej liter (^
i$
zaznaczają początek i koniec łańcucha).Jeśli chcesz, aby dopasować inne litery niż-Z, można je dodać do zestawu znaków:
[a-zA-ZäöüßÄÖÜ]
. Lub używasz predefiniowanych klas znaków, takich jak klasa właściwości znaków Unicode,\p{L}
która opisuje znaki Unicode, które są literami.źródło
\p{L}
dopasowuje wszystko, co jest literą Unicode, jeśli interesują Cię alfabety inne niż łacińskieźródło
\p
jako „znak do wydruku”.\p{L}\p{M}*+
dotyczyć listów składających się z wielu współrzędnych kodowych, np. Litery poprzedzającej znaki akcentujące. Jak na regular-expressions.info/unicode.htmlbad escape \p at position 0
W zależności od znaczenia „postaci”:
źródło
[A-Za-z]
są literami, należy określić język, który jest używanyNajbliższa dostępna opcja to
który pasuje do sekwencji wielkich i małych liter. Jednak nie jest obsługiwany przez wszystkie edytory / języki, więc korzystanie z niego jest prawdopodobnie bezpieczniejsze
jak sugerują inni użytkownicy
źródło
Użyłbyś
[] - sprawdza wszelkie znaki między podanymi danymi wejściowymi
az --- obejmuje cały alfabet
g ----- globalnie w całym ciągu
i ----- uzyskiwanie wielkich i małych liter
źródło
Wyrażenie regularne, które kilka osób napisało jako „/ ^ [a-zA-Z] $ / i” jest niepoprawne, ponieważ w końcu wspomniały / i, które nie rozróżnia wielkości liter i po dopasowaniu po raz pierwszy wróci. Zamiast / używam po prostu / g, który jest globalny, a ty nie musisz umieszczać ^ $ na początku i na końcu.
źródło
Jawa:
źródło
ŹŻŚĄ
Bardzo prosty przykład. Wyrażenia regularne są niezwykle łatwe do znalezienia w Internecie.
http://www.regular-expressions.info/reference.html
źródło
W przypadku PHP następujące będą działać poprawnie
źródło
Używaj grup postaci
Dopasowuje dowolny znak oprócz cyfr 0–9
Zobacz przykład tutaj
źródło
Po prostu użyj
\w
lub[:alpha:]
. To sekwencje specjalne, które pasują tylko do symboli, które mogą pojawić się w słowach.źródło
\w
może nie być dobrym rozwiązaniem we wszystkich przypadkach. Przynajmniej w PCRE,\w
może również pasować do innych postaci. Cytując instrukcję PHP : Znak „słowo” to dowolna litera lub cyfra lub znak podkreślenia, czyli dowolny znak, który może być częścią „słowa” Perla. Definicja liter i cyfr jest kontrolowana przez tabele znaków PCRE, i mogą się różnić, jeśli ma miejsce dopasowanie specyficzne dla ustawień narodowych. Na przykład w ustawieniach narodowych „fr” (francuski) niektóre litery znaków większe niż 128 są używane dla liter akcentowanych i są dopasowywane przez \ w. ”.\w
oznacza dopasuj litery i cyfryJeśli masz na myśli jakiekolwiek litery w jakimkolwiek kodowaniu znaków, dobrym rozwiązaniem może być usunięcie nieliterowych znaków, takich jak spacje
\s
, cyfry\d
i inne znaki specjalne, takie jak:Lub użyj negacji powyższej negacji, aby bezpośrednio opisać dowolne litery:
Plusy:
Cons:
źródło
Możesz wypróbować to wyrażenie regularne:
[^\W\d_]
lub[a-zA-Z]
.źródło
[^\W|\d]
znaczy[^\W|\d]
znaczy nie\W
i nie|
i nie\d
. Ma ten sam efekt netto, ponieważ|
jest częścią,\W
ale|
nie działa tak, jak myślisz. Nawet wtedy oznacza to, że akceptuje_
postać. Prawdopodobnie szukasz[^\W\d_]
_
. Ale „NIE”|
jest równe „I”, więc[^\W|\d]
oznacza: NIE\W
I NIE\d
[^ab]
znaczy niea
i nieb
.[^a|b]
znaczy niea
i nie|
i nieb
. Aby dać drugi przykład[a|b|c|d]
jest dokładnie taka sama jak[abcd|||]
która jest dokładnie taka sama, jak[abcd|]
- z których wszystkie są równe jest dosłowny charakter, a nie operator OR. Operator OR jest sugerowany między każdym znakiem w klasie znaków, co oznacza, że klasa ma akceptować znak (potok).([a]|[b]|[c]|[d]|[|])
|
|
|
Ostatnio używałem tego wzoru w swoich formularzach do sprawdzania nazwisk osób, zawierających litery, spacje i znaki specjalne, takie jak znaki akcentujące.
źródło
A-z
dopasowuje więcej niż tylko litery, a takżeÀ-ú
wzór = / [a-zA-Z] /
wstawia „[a-zA-Z]: # {pattern.match („ mine blossom ”)}„ OK
wstawia „[a-zA-Z]: # {pattern.match („ 456 ”)}”
wstawia „[a-zA-Z]: # {pattern.match („ ”)}”
wstawia „[a-zA-Z]: # {pattern.match („ # $% ^ & * ”)}”
wstawia „[a-zA-Z]: # {pattern.match („ # $% ^ & * A ”)}„ OK
źródło
źródło