2010-10-29 16 views
35

Desidero conoscere l'espressione regolare per il seguente caso:Espressione regolare per verificare se le lettere maiuscole si trovano consecutivamente in una stringa?

La stringa deve contenere solo lettere alfabetiche. Deve iniziare con una lettera maiuscola seguita da una lettera minuscola. Quindi può essere lettere minuscole o maiuscole.

^[A-Z][a-z][A-Za-z]*$ 

Tuttavia, la stringa non deve contenere maiuscole consecutive. Come aggiungo quella logica alla regexp?

Cioè, HttpHandler è corretto, ma HTTPHandler è errato.

risposta

23

modifica: 2015-10-26: grazie per le revisioni, ma date un'occhiata alla risposta di tchrist. (uno sotto) specialmente se sviluppi per il web o qualcosa di più "internazionale".

Oren Trutners risposta non è abbastanza di destra (vedi ingresso campione di "RightHere" che deve essere abbinato, ma non lo è)

ecco la soluzione giusta:

(?!^.*[A-Z]{2,}.*$)^[A-Za-z]*$ 

edit:

(?!^.*[A-Z]{2,}.*$) // don't match the whole expression if there are two or more consecutive uppercase letters 
^[A-Za-z]*$   // match uppercase and lowercase letters 

/modifica

la chiave per la soluzione è un lookahead negativo se e: http://www.regular-expressions.info/lookaround.html

+0

wat fa? ! . eccetera? – kiki

+0

è un aspetto negativo: consulta il mio link pubblicato per una spiegazione approfondita. fondamentalmente dice che se la regex tra il lookahead negativo è abbinata, l'intera espressione non viene eguagliata. quindi puoi per esempio dire:^[0-9] $ (confronta un numero da 0 a 9. e puoi dire (?!^3 $)^[0-9] $ (corrisponde a un numero da 0 a 9 tranne 3). –

9
^([A-Z][a-z]+)+$ 

Questo cerca sequenze di lettere maiuscole seguite da una o più lettere minuscole. Le lettere maiuscole consecutive non corrispondono, poiché solo una è ammessa alla volta e deve essere seguita da una minuscola.

+0

Pls scusa la mia ignoranza. Vedi, questa è la mia espressione regolare al momento: (^ [A-Z] [a-z] [A-Za-z] * $) | (^ I [A-Z] [a-z] [A-Za-z] * $). In questo, devo aggiungere la logica per verificare che le lettere maiuscole non siano insieme nella parte [A-Za-z]. Che cosa suggeriresti? E cosa significa + esattamente? – kiki

+0

Questo non corrisponderà al TestX valido poiché non corrisponderà alla lettera maiuscola finale – Falco

101

Ogni volta che si scrive [A-Z] o [a-z], uno si impegna a elaborare solo dati ASCII a 7 bit. Se è davvero ok, allora va bene. Ma se non lo è, esistono le proprietà Unicode per aiutare con questo.

Esistono tre casi in Unicode, non due. Inoltre, hai anche lettere non scritte. Lettere in generale sono specificati dalla proprietà \pL, e ciascuna di queste appartiene anche esattamente una delle cinque categorie:

  1. lettere maiuscole, indicati con \p{Lu}; es .: AÇDZÞΣSSὩΙST
  2. lettere di maiuscolo, specificate con \p{Lt}; ad esempio: LjDzSsᾩSt (in realtà Ss e St sono una superiore e quindi una lettera minuscola, ma sono quello che si ottiene se si chiede per la Titlecase di ß e , rispettivamente)
  3. lettere minuscole, specificato con \p{Ll}; es .: aαçdzςσþßᾡſt
  4. lettere di modificatore, specificate con \p{Lm}; es .: ʰʲᴴᴭʺˈˠᵠꜞ
  5. altre lettere, specificato con \p{Lo}; ad esempio: ƻאᎯᚦ京

È possibile prendere il complemento di una di queste, ma attenzione, perché qualcosa di simile \P{Lu} fa non significa una lettera che non è maiuscolo. Significa qualsiasi carattere che non sia una lettera maiuscola.

Per la lettera che sia in maiuscolo o in titlecase, utilizzare [\p{Lu}\p{Lt}].Così si potrebbe utilizzare per il modello:

 ^([\p{Lu}\p{Lt}]\p{Ll}+)+$ 

Se coloro che non intendi per limitare le lettere che seguono il primo a soli lettere involucro, allora si potrebbe preferire:

 ^([\p{Lu}\p{Lt}][\p{Ll}\p{Lm}\p{Lo}]+)+$ 

Se si' cercando di associare i cosiddetti identificatori "CamelCase", le regole effettive dipendono dal linguaggio di programmazione, ma solitamente includono il carattere di sottolineatura e i numeri decimali (\p{Nd}) e possono includere un segno di dollaro letterale. Se è così, potresti voler aggiungere alcuni di questi all'una o all'altra delle due classi di caratteri sopra. Ad esempio, si potrebbe desiderare di aggiungere sottolineatura per entrambi, ma le cifre solo al secondo, lasciando con:

 ^([_\p{Lu}\p{Lt}][_\p{Nd}\p{Ll}\p{Lm}\p{Lo}]+)+$ 

Se, però, avete a che fare con certe parole da varie RFC e standard ISO, questi sono spesso specificati come contenente solo ASCII. Se è così, puoi cavartela con l'idea letterale [A-Z]. Non è gentile imporre questa restrizione se non esiste realmente.

+0

Totalmente concordata in merito alla restrizione. Ecco un po 'più di informazioni su questo: [Regular-expressions.info] (http://www.regular-expressions.info/unicode.html). – Daneo

+1

Nel caso in cui si voglia usare 're' in python, è necessario sapere che non supporta la proprietà dei caratteri Unicode. http://pypi.python.org/pypi/regex fa. – noisy

+3

Aspetta un secondo, ci sono persone che ** non ** usano perl per regexen? – hd1

3

parte tchrists ottimo post riguardante unicode, penso che non hai bisogno di una soluzione complessa con un lookahead negativo ... tua definizione richiede un maiuscolo-lettera seguita da almeno un gruppo di (un minuscolo lettera eventualmente seguita da un maiuscolo lettere)

^ 
[A-Z] // Start with an uppercase Letter 
(  // A Group of: 
    [a-z] // mandatory lowercase letter 
    [A-Z]? // an optional Uppercase Letter at the end 
     // or in between lowercase letters 
)+  // This group at least one time 
$ 

Solo un po 'più compatto e più facile da leggere penso ...

-6

Se si desidera ottenere tutti nome dei dipendenti in MySQL che avendo almeno una maiuscola lettera di applicare questa query.

SELECT * FROM registration WHERE `name` REGEXP BINARY '[A-Z]'; 
Problemi correlati