Szkoda, że różne silniki wyrażeń regularnych mają różne sposoby dopasowania alfanumerycznych. Takie pytanie (raczej niejasne, bez wskazania smaku języka / wyrażenia regularnego) wymaga bardzo długiej lub przynajmniej bardzo zorganizowanej odpowiedzi dotyczącej każdego smaku.
Wiktor Stribiżew
Odpowiedzi:
938
Aby dopasować ciąg zawierający tylko te znaki (lub pusty ciąg), spróbuj
"^[a-zA-Z0-9_]*$"
Działa to w przypadku wyrażeń regularnych .NET i prawdopodobnie także wielu innych języków.
Podział:
^: start ofstring[: beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9: any digit
_ : underscore
]:endof character group*: zero or more of the given characters
$ :endofstring
Jeśli nie chcesz zezwalać na puste ciągi, użyj + zamiast *.
Jak zauważyli inni, niektóre języki wyrażeń regularnych mają skróconą formę [a-zA-Z0-9_]. W języku regularnym .NET możesz włączyć zachowanie ECMAScript i używać go \wjako skrótu (wydajnego ^\w*$lub ^\w+$). Zauważ, że w innych językach, i domyślnie w .NET, \wjest nieco szerszy i będzie pasował również do innych rodzajów znaków Unicode (dzięki Janowi za zwrócenie na to uwagi). Jeśli więc naprawdę chcesz dopasować tylko te znaki, prawdopodobnie najlepiej jest użyć jawnej (dłuższej) formy.
Jeśli kiedykolwiek pojedziesz do Niemiec lub zobaczysz tekst w języku niemieckim, zobaczysz, co mówię.
programista systemu Windows
30
\ w i [A-Za-z0-9_] nie są równoważne w większości odmian regex. \ w obejmuje litery ze znakami diakrytycznymi, litery z innych skryptów itp.
Jan Goyvaerts
4
Pierwotne pytanie brzmiało „wielkie i małe litery”, więc wydaje się, że „litery” ze skryptów niełacińskich powinny się zgadzać.
Trejkaz
3
[\p{upper}\p{lower}\p{gc=Number}_]to wszystko, czego potrzebujesz, aby zrobić to dobrze, zakładając, że nie ma łączenia postaci.
tchrist
1
Wygląda na to, że preg_match wymaga, aby twój wzór był otoczony ogranicznikami, które zwykle są ukośnikami. Potrzebujesz więc „/ ^ [a-zA-Z0-9 _] * $ /”. Patrz na to pytanie, aby uzyskać więcej informacji: stackoverflow.com/questions/6445133/... . Zobacz także tę stronę: forums.phpfreaks.com/topic/…
Charlie
346
Jest tu wiele gadatliwości i jestem głęboko temu przeciwny, więc moja rozstrzygająca odpowiedź brzmiałaby:
/^\w+$/
\wjest równoważne [A-Za-z0-9_], co jest prawie tym, czego chcesz. (chyba że wprowadzimy Unicode do miksu)
Za pomocą +kwantyfikatora dopasujesz jeden lub więcej znaków. Jeśli chcesz również zaakceptować pusty ciąg, użyj *zamiast tego.
Angielski nie jest jedynym językiem na świecie, więc powinna to być zaakceptowana odpowiedź, a nie [a-z]i jej odmiany. \wprzechwytuje także postacie niełacińskie. Like šēēāorкукареку
Alex
1
Zatwierdzony na stronie 318 O'Reilly „Mastering Regular Expressions”
guidotex
36
Chcesz sprawdzić, czy każda postać spełnia twoje wymagania, dlatego używamy:
[A-Za-z0-9_]
I możesz nawet użyć wersji skróconej:
\w
Co jest równoważne (w niektórych odmianach wyrażeń regularnych, więc upewnij się, że sprawdziłeś przed użyciem). Następnie, aby wskazać, że cały ciąg musi pasować, użyj:
^
Aby wskazać, że ciąg musi zaczynać się od tego znaku, a następnie użyj
$
Aby wskazać, ciąg musi kończyć się tym znakiem. Następnie użyj
\w+or \w*
Aby wskazać „1 lub więcej” lub „0 lub więcej”. Podsumowując, mamy:
\ w i [A-Za-z0-9_] nie są równoważne w większości odmian regex. \ w obejmuje litery ze znakami diakrytycznymi, litery z innych skryptów itp.
Jan Goyvaerts
31
Um ... pytanie: Czy musi mieć co najmniej jedną postać, czy nie? Czy może to być pusty ciąg?
^[A-Za-z0-9_]+$
Wykona co najmniej jedną wielką lub małą literę alfanumeryczną lub podkreślnik. Jeśli może mieć zerową długość, wystarczy zastąpić + znakiem *
^[A-Za-z0-9_]*$
Edytować:
Jeśli należy uwzględnić znaki diakrytyczne (takie jak cedilla - ç), należy użyć znaku słowa, który robi to samo co powyżej, ale zawiera znaki diakrytyczne:
Jednak podczas gdy dokumentacja w powyższych linkach stwierdza, że \w„Dopasuje dowolny znak z zakresu 0–9, A – Z i a – z (odpowiednik POSIX [: alnum:])”, nie stwierdziłem, że jest to prawdą . W grep -Pkażdym razie nie. Musisz użyć podkreślenia, jeśli używasz, [:alnum:]ale nie jeśli używasz \w. W skrócie i na słodko nie możesz:
^\w+$
Oprócz czytelności użycie klas znaków POSIX ( http://www.regular-expressions.info/posixbrackets.html ) oznacza, że wyrażenie regularne może działać na ciągach znaków innych niż ASCII, czego nie będą robić wyrażenia regularne oparte na zakresie, ponieważ polegają na podstawowa kolejność znaków ASCII, która może różnić się od innych zestawów znaków, a zatem wyklucza niektóre znaki inne niż ASCII (litery takie jak -), które możesz chcieć przechwycić.
W informatyce wartość alfanumeryczna często oznacza, że pierwszym znakiem nie jest liczba, ale alfabet lub znak podkreślenia. Następnie postać może być 0-9, A-Z, a-z, lub podkreślenia ( _).
Jak byśmy zrobili, gdybyśmy chcieli dodać _ i - do listy?
Rahi
10
Wypróbuj te wielojęzyczne rozszerzenia, które stworzyłem dla łańcucha.
IsAlphaNumeric - Ciąg musi zawierać co najmniej 1 alfa (literę w zakresie Unicode, określoną w charSet) i co najmniej 1 liczbę (określoną w numSet). Łańcuch powinien również składać się wyłącznie z liter i cyfr.
IsAlpha - Łańcuch powinien zawierać co najmniej 1 alfa (w określonym języku charSet) i składać się tylko z alfa.
IsNumeric - Łańcuch powinien zawierać co najmniej 1 liczbę (w określonym języku numSet) i zawierać tylko liczby.
Można określić zakres charSet / numSet dla żądanego języka. Zakresy Unicode są dostępne pod poniższym linkiem:
//Englishstring test ="AASD121asf";//Greek//string test = "Ϡϛβ123";//Bengali//string test = "শর৩৮";//Hindi//string test = @"क़लम३७ख़";bool isAlphaNum = test.IsAlphaNumeric();
Następujące wyrażenie regularne pasuje do znaków alfanumerycznych i znaku podkreślenia:
^[a-zA-Z0-9_]+$
Na przykład w Perlu:
#!/usr/bin/perl -wmy $arg1 = $ARGV[0];# check that the string contains *only* one or more alphanumeric chars or underscoresif($arg1 !~/^[a-zA-Z0-9_]+$/){print"Failed.\n";}else{print"Success.\n";}
Wzorzec w kodzie jest poprawny, ale powyższy wzorzec sprawdza tylko jedno wystąpienie.
BenAlabaster,
Było to zamierzone, próbka kodu miała na celu wyjaśnienie użycia podczas sprawdzania łańcucha. Także dlaczego kod ma także znaczniki początku i końca linii, których nie ma w wyrażeniu regularnym.
Jay
1
@Windows programmer - en.wikipedia.org/wiki/Alphanumeric - alfabet łaciński , a nie „zestaw znaków łacińskich”, który obejmuje znaki diakrytyczne itp. Jest to czysto problem semantyki, ale ja osobiście stosuję powszechne użycie terminu alfanumerycznego jako AZ i 0–9.
Jay
2
ñ to litera alfabetu w języku hiszpańskim, w tym w Ameryce Łacińskiej.
programista systemu Windows
2
„Chciałbym mieć wyrażenie regularne, które sprawdza, czy łańcuch zawiera tylko wielkie i małe litery, cyfry i podkreślenia” nie ogranicza go do liter łacińskich. „Poniższy regex pasuje do znaków alfanumerycznych i podkreślenia” nie ogranicza go do liter łacińskich. „^ [a-zA-Z0-9 _] + $” kończy się niepowodzeniem.
O którym liście mówisz? Moje wyrażenie regularne zawiera jedno zadane w pytaniu. Alfabety, cyfry, podkreślniki
Chinmaya Pati,
1234to słowo od wnioskowanej przez autora języku. Twój język jest bardziej restrykcyjny.
Dmitrij Kuźminow,
4
Dla mnie był problem polegający na tym, że chcę rozróżnić między alfą, liczbami i alfą, więc aby zapewnić, że ciąg alfanumeryczny zawiera przynajmniej jedną alfę i przynajmniej jedną cyfrę, użyłem:
Jeśli chcesz po prostu łaciny, wykonaj p {Latin} zamiast p {L}
Agustin
2
Wierzę, że nie bierzesz znaków łacińskich i Unicode w swoich dopasowaniach. Na przykład, jeśli chcesz wziąć znaki „ã” lub „ü”, użycie „\ w” nie będzie działać.
To działa dla mnie, znalazłem to w „Mastering Regular Expressions” O'Reilly:
/^\w+$/
Wyjaśnienie:
^ potwierdza pozycję na początku łańcucha
\ w + dopasowuje dowolny znak słowa (równy [a-zA-Z0-9_])
Kwantyfikator „+” - dopasowuje od jednego do nieograniczonego czasu, tyle razy, ile to możliwe, zwracając w razie potrzeby (zachłanny)
$ zapewnia pozycję na końcu ciągu
Sprawdź siebie:
const regex =/^\w+$/;const str =`nut_cracker_12`;let m;if((m = regex.exec(str))!==null){// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex)=>{
console.log(`Found match, group ${groupIndex}: ${match}`);});}
Odpowiedzi:
Aby dopasować ciąg zawierający tylko te znaki (lub pusty ciąg), spróbuj
Działa to w przypadku wyrażeń regularnych .NET i prawdopodobnie także wielu innych języków.
Podział:
Jeśli nie chcesz zezwalać na puste ciągi, użyj + zamiast *.
Jak zauważyli inni, niektóre języki wyrażeń regularnych mają skróconą formę
[a-zA-Z0-9_]
. W języku regularnym .NET możesz włączyć zachowanie ECMAScript i używać go\w
jako skrótu (wydajnego^\w*$
lub^\w+$
). Zauważ, że w innych językach, i domyślnie w .NET,\w
jest nieco szerszy i będzie pasował również do innych rodzajów znaków Unicode (dzięki Janowi za zwrócenie na to uwagi). Jeśli więc naprawdę chcesz dopasować tylko te znaki, prawdopodobnie najlepiej jest użyć jawnej (dłuższej) formy.źródło
[\p{upper}\p{lower}\p{gc=Number}_]
to wszystko, czego potrzebujesz, aby zrobić to dobrze, zakładając, że nie ma łączenia postaci.Jest tu wiele gadatliwości i jestem głęboko temu przeciwny, więc moja rozstrzygająca odpowiedź brzmiałaby:
\w
jest równoważne[A-Za-z0-9_]
, co jest prawie tym, czego chcesz. (chyba że wprowadzimy Unicode do miksu)Za pomocą
+
kwantyfikatora dopasujesz jeden lub więcej znaków. Jeśli chcesz również zaakceptować pusty ciąg, użyj*
zamiast tego.źródło
\w
zwykle nie ogranicza się tylko do ASCII.[a-z]
i jej odmiany.\w
przechwytuje także postacie niełacińskie. Likešēēā
orкукареку
Chcesz sprawdzić, czy każda postać spełnia twoje wymagania, dlatego używamy:
I możesz nawet użyć wersji skróconej:
Co jest równoważne (w niektórych odmianach wyrażeń regularnych, więc upewnij się, że sprawdziłeś przed użyciem). Następnie, aby wskazać, że cały ciąg musi pasować, użyj:
Aby wskazać, że ciąg musi zaczynać się od tego znaku, a następnie użyj
Aby wskazać, ciąg musi kończyć się tym znakiem. Następnie użyj
Aby wskazać „1 lub więcej” lub „0 lub więcej”. Podsumowując, mamy:
źródło
Um ... pytanie: Czy musi mieć co najmniej jedną postać, czy nie? Czy może to być pusty ciąg?
Wykona co najmniej jedną wielką lub małą literę alfanumeryczną lub podkreślnik. Jeśli może mieć zerową długość, wystarczy zastąpić + znakiem *
Edytować:
Jeśli należy uwzględnić znaki diakrytyczne (takie jak cedilla - ç), należy użyć znaku słowa, który robi to samo co powyżej, ale zawiera znaki diakrytyczne:
Lub
źródło
Chociaż jest to bardziej szczegółowe
\w
, osobiście doceniam czytelność pełnych nazw klas znaków POSIX ( http://www.zytrax.com/tech/web/regex.htm#special ), więc powiedziałbym:Jednak podczas gdy dokumentacja w powyższych linkach stwierdza, że
\w
„Dopasuje dowolny znak z zakresu 0–9, A – Z i a – z (odpowiednik POSIX [: alnum:])”, nie stwierdziłem, że jest to prawdą . Wgrep -P
każdym razie nie. Musisz użyć podkreślenia, jeśli używasz,[:alnum:]
ale nie jeśli używasz\w
. W skrócie i na słodko nie możesz:Oprócz czytelności użycie klas znaków POSIX ( http://www.regular-expressions.info/posixbrackets.html ) oznacza, że wyrażenie regularne może działać na ciągach znaków innych niż ASCII, czego nie będą robić wyrażenia regularne oparte na zakresie, ponieważ polegają na podstawowa kolejność znaków ASCII, która może różnić się od innych zestawów znaków, a zatem wyklucza niektóre znaki inne niż ASCII (litery takie jak -), które możesz chcieć przechwycić.
źródło
W informatyce wartość alfanumeryczna często oznacza, że pierwszym znakiem nie jest liczba, ale alfabet lub znak podkreślenia. Następnie postać może być
0-9
,A-Z
,a-z
, lub podkreślenia (_
).Oto jak to zrobiłbyś:
Testowane pod php:
lub weź to
i umieść go w języku programowania.
źródło
Co powiesz na:
... jeśli chcesz być jawny lub:
... jeśli wolisz zwięzły (składnia Perla).
źródło
użyj lookaheads, aby wykonać „co najmniej jedną” czynność. Zaufaj mi, to dużo łatwiejsze.
Oto przykład, który wymagałby 1-10 znaków, zawierający co najmniej jedną cyfrę i jedną literę:
UWAGA: można było użyć \ w, ale następnie rozważania ECMA / Unicode zwiększają zasięg znaków w „znaku słowa”.
źródło
Wypróbuj te wielojęzyczne rozszerzenia, które stworzyłem dla łańcucha.
IsAlphaNumeric - Ciąg musi zawierać co najmniej 1 alfa (literę w zakresie Unicode, określoną w charSet) i co najmniej 1 liczbę (określoną w numSet). Łańcuch powinien również składać się wyłącznie z liter i cyfr.
IsAlpha - Łańcuch powinien zawierać co najmniej 1 alfa (w określonym języku charSet) i składać się tylko z alfa.
IsNumeric - Łańcuch powinien zawierać co najmniej 1 liczbę (w określonym języku numSet) i zawierać tylko liczby.
Można określić zakres charSet / numSet dla żądanego języka. Zakresy Unicode są dostępne pod poniższym linkiem:
http://www.ssec.wisc.edu/~tomw/java/unicode.html
API:
Stosowanie :
źródło
Następujące wyrażenie regularne pasuje do znaków alfanumerycznych i znaku podkreślenia:
Na przykład w Perlu:
źródło
Powinno to działać w większości przypadków.
/^[\d]*[a-z_][a-z\d_]*$/gi
I przez większość mam na myśli
Wyjaśnienie
^ ... $
- dopasuj wzór zaczynając i kończąc na[\d]*
- dopasuj zero lub więcej cyfr[a-z_]
- dopasuj alfabet lub podkreślnik[a-z\d_]*
- dopasuj alfabet lub cyfrę lub podkreślnik/gi
- dopasowuje globalnie ciąg i nie rozróżnia wielkości literźródło
1234
to słowo od wnioskowanej przez autora języku. Twój język jest bardziej restrykcyjny.Dla mnie był problem polegający na tym, że chcę rozróżnić między alfą, liczbami i alfą, więc aby zapewnić, że ciąg alfanumeryczny zawiera przynajmniej jedną alfę i przynajmniej jedną cyfrę, użyłem:
źródło
Oto regex dla tego, co chcesz z kwantyfikatorem, aby określić co najmniej 1 znak i nie więcej niż 255 znaków
źródło
Dla tych z Was, którzy szukają alfanumerycznego dopasowywania unicode, warto zrobić coś takiego:
Dalsza lektura na http://unicode.org/reports/tr18/ i na http://www.regular-expressions.info/unicode.html
źródło
Wierzę, że nie bierzesz znaków łacińskich i Unicode w swoich dopasowaniach. Na przykład, jeśli chcesz wziąć znaki „ã” lub „ü”, użycie „\ w” nie będzie działać.
Alternatywnie możesz użyć tego podejścia:
Mam nadzieję, że to pomoże!
źródło
Aby sprawdzić cały ciąg i nie zezwalać na puste ciągi, spróbuj
źródło
^\w*$
będzie działać dla poniższych kombinacjiźródło
to działa dla mnie, możesz spróbować
źródło
To działa dla mnie, znalazłem to w „Mastering Regular Expressions” O'Reilly:
Wyjaśnienie:
Sprawdź siebie:
źródło