2011-02-02 7 views
5

Mam regex, które teraz pozwala tylko małe litery, muszę taki, który wymaga zarówno małe jak i duże litery:potrzebują JavaScript Regex wymagającego górne lub małe litery

/(?=.*[a-z])/ 
+2

Czy zdajesz sobie sprawę, że to wyrażenie regularne jest równoważne '/ [AZ] /' i dopasowuje każdy ciąg zawierający co najmniej jedną małą literę? – delnan

+0

Co to jest użycie nawiasów, jeśli zamierzasz odrzucić (?? = ') Przechwytywanie? – Martijn

+0

@Martjin: Parens są wymagane do wyprzedzania (i wielu innych rzeczy) i nie grupują się. – delnan

Odpowiedz

7

Spróbuj /(?=.*[a-z])/i

Note na końcu to czyni wielkość liter nieodczuwalną.

+0

Właściwie czuję, że Platynowy Azure dał lepszą odpowiedź tutaj. – Leigh

+0

Ten wzór nie pasuje do małych liter 1723. – tchrist

+2

Bądź co bądź, OP przyjął twoją odpowiedź, ponieważ odpowiedział na jego/jej pytanie. Po prostu idź z nim :-) –

2

lub dodać wielką gamę do regex:

/(?=.*[a-zA-Z])/ 
+1

To nie jest sposób, w jaki dopasowuje się wielkie litery. Lub też małe litery, jeśli o to chodzi. To okropne podejście z lat sześćdziesiątych. Jest co najmniej 20 lat przestarzały i nie ma miejsca w nowoczesnym przetwarzaniu tekstu. – tchrist

+2

@tchrist - ładny, 1960, 20 lat, świetnie. Wyjaśnienie proszę? Uprzejmie pomóż mi poprawić moje wyrazy regularne. – karim79

+0

7-bitowy ASCII pojawił się w latach 60-tych. Unicode ma teraz 20 lat, a kody ISO 8859 są jeszcze starsze. ASCII jest zbyt oldschoolowym, by służyć dzisiejszemu światu. Sieć to * nie * ASCII! – tchrist

16

Nie wiem, czy chodziło Ci pisane małymi lub małymi literami oraz ściśle ściśle wielkie.

Oto wersja mieszanych przypadek:

/^[a-zA-Z]+$/ 

A ściśle jeden-or-the-inna wersja:

/^([a-z]+|[A-Z]+)$/ 
+0

Dobra rozmowa, nie sądziłem, że poproszono o drugą wersję. – Leigh

+0

Uwzględniam kotwice w drugim z nich ('^ ([a-z] + | [A-Z] +) $'), ale poza tym, co bym zasugerował. +1 – delnan

+0

@Leigh: Nie byłem pewien, pytanie było po prostu niejasne. Widziałem tutaj różnego rodzaju pytania :-) –

18

nie można dostać się tam z naszym

Mam wyrażenie regularne, które obecnie pozwala tylko na małe litery, potrzebuję takiego, który wymaga małych lub wielkich liter: /(?=.*[a-z])/

Niestety, jest to utterly impossible to do this correctly using Javascript! Przeczytaj this flavor comparison’s ECMA column dla wszystkich tego, co JavaScript nie może zrobić zrobić.

Teoria vs Practice

Właściwa wzorzec dla małych liter jest standard Unicode pochodzące własności binarnego \p{Lowercase} oraz właściwego wzór wielkimi literami podobnie \p{Uppercase}. Są to właściwości normatywne, które czasami zawierają w sobie nie-litery w pewnych egzotycznych okolicznościach.

Używając tylko właściwości ogólnej kategorii, możesz mieć \p{Ll} dla Lowercase_Letter, \p{Lu} dla Uppercase Letter i \p{Lt} dla letter titlemase. Pamiętaj, że są to trzy przypadki w Unicode, a nie dwa). Istnieje standardowy alias \p{LC}, co oznacza [\p{Lu}\p{Lt}\p{Ll}].

Jeśli chcesz otrzymać literę niż jest , nie małą literą, możesz użyć . Napisany w longhandzie to (?=\P{Lowercase_Letter})\p{Letter}. Ponownie, te miksują niektóre z innych punktów kodu kodu innej_wersji, które rozpoznaje \p{Lowercase}. Muszę jeszcze raz podkreślić, że własność Smallcase jest nadzbiorem właściwości Lowercase_Letter.

Zapamiętaj poprzedni akapit, zamień w górnym miejscu, gdziekolwiek napisałem niżej, a otrzymasz to samo dla stolic.

Możliwe Platformy

Ponieważ dostęp do tych zasadniczych właściwości jest minimalny poziom krytyczny funkcjonalność niezbędną dla Unicode regular expressions, niektóre wersje JavaScript je realizować tylko w ten sposób napisałem je powyżej.Jednak standard JavaScript wciąż ich nie wymaga, więc nie można na nich na ogół liczyć. Oznacza to, że nie jest to możliwe poprawnie pod wszystkimi implementacjami Javascript.

Języki, w których możliwe jest to, co chcesz zrobić minimalnie obejmują:

  • C♯ i Java (zarówno tylko ogólne kategorie)
  • Ruby wtedy i tylko wtedy v1.9 lub lepszy (tylko binarne, w tym właściwości ogólnych kategoriach)
  • PHP i PCRE (tylko ogólne Kategoria Script i właściwości plus kilka dodatki) biblioteka C++
  • OIOM i Perl, które obsługują wszystkim właściwości Unicode

z wymienionych Bove, tylko ostatnia linia jest - ICU i Perl - ściśle i całkowicie spełniają wszystkie Level 1 wymogi zgodności (plus pewne poziomy 2 i 3) do właściwego obchodzenia się z Unicode w regexes. Jednak wszystkie te, które wymieniłem w punktach poprzedniego akapitu, z łatwością poradzą sobie z większością i prawdopodobnie wszystkim, czego potrzebujesz.

Jednak JavaScript nie należy do takich. Twoja wersja może jednak, jeśli masz dużo szczęścia i nigdy nie będziesz musiał uruchamiać na platformie JavaScript w wersji standardowej.

Podsumowanie

Tak bardzo smutno, naprawdę nie można użyć regexes JavaScript dla Unicode pracy, chyba że masz niestandardowego rozszerzenia. Niektórzy tak, ale większość nie. Jeśli tego nie zrobisz, być może będziesz musiał użyć innej platformy, dopóki odpowiedni standard ECMA nie zacznie działać w XXI wieku (Unicode 3.1 pojawił się dekadę temu !!).

Jeśli ktoś wie biblioteki JavaScript, który implementuje poziomie 1 wymagania UTS#18 on Unicode Regular Expressions tym zarówno RL1.2 “Properties” i RL1.2a “Annex C: Compatibility Properties”, proszę gongu w.

+1

Powinienem wiedzieć, że napiszesz traktat. :-) Moja jedyna odpowiedź jest taka, że ​​nic nie wskazuje na to, że OP dba o Unicode lub i18n. :-) –

+1

i18n nie ma znaczenia. Przyjmij wszystkie domyślne 7-bitowe kody błędów, chyba że udowodniono, że jest inaczej. Witamy w ciągu ostatnich 20 lat! – tchrist

+0

* wzruszając ramionami * Wystarczająco dobre. Nie przesłałem ci tego, przy okazji. –

Powiązane problemy