2011-06-06 69 views
21

Utilizo este #(\s|^)([a-z0-9-_]+)#i para poner en mayúscula cada primera letra de cada palabra, quiero que también mayúscula la letra si es después de una marca especial como un guión (-)Regex escribe en mayúscula la primera letra de cada palabra, también después de un carácter especial como un guión

Ahora se nota:

This Is A Test For-stackoverflow 

y quiero que esto:

This Is A Test For-Stackoverflow 

Cualquier sugerencia/muestras para mí?

No soy un profesional, así que trata de que sea fácil de entender para mí.

+3

¿También necesita utilizar letras que no sean ASCII ('à',' ü', etc.)? Qué idioma estás usando? –

+0

¿Qué expresiones regulares del idioma está preguntando? – JohnK

Respuesta

17

Una solución simple es utilizar word boundaries:

#\b[a-z0-9-_]+#i 

Como alternativa, puede hacer coincidir por unos pocos caracteres:

#([\s\-_]|^)([a-z0-9-_]+)#i 
+0

¡Gracias! ¡Funciona de maravilla! – Simmer

+1

¿Por qué estás combinando '-' y' _'? No es necesario que se escriban con mayúscula ... –

+2

@Tim - Tomé libertad artística y no cambié la forma en que el OP combina con las letras - Es * posible * Simmer quiere la letra como salida, cambie sus colores o lo que sea. Además, no pensé mucho, solo tenía 4 minutos ': P' – Kobi

0

Trate #([\s-]|^)([a-z0-9-_]+)#i - la (\s|^) Coincide con un carácter de espacio en blanco (\s) o el comienzo de la línea (^). Cuando cambia el \s al [\s-], coincide con cualquier carácter de espacio en blanco o un guión.

+0

¡Gracias!Funciona como un amuleto – Simmer

5

En realidad no necesita coincidir cadena completa acaba de coincidir con la primera letra no mayúsculas así:

'~\b([a-z])~' 
+3

en js, he agregado 'g' como'/\ b ([az])/g' para poner en mayúscula cada palabra –

+1

me gusta su respuesta encantadora @StalinGino debe decir que esta es la única que pude comprender. – Danish

0

esto hará que

REAC De Boeremeakers

de

reac de boeremeakers

(?<=\A|[ .])(?<up>[a-z])(?=[a-z. ]) 

usando

Dim matches As MatchCollection = Regex.Matches(inputText, "(?<=\A|[ .])(?<up>[a-z])(?=[a-z. ])") 
    Dim outputText As New StringBuilder 
    If matches(0).Index > 0 Then outputText.Append(inputText.Substring(0, matches(0).Index)) 
    index = matches(0).Index + matches(0).Length 
    For Each Match As Match In matches 
     Try 
      outputText.Append(UCase(Match.Value)) 
      outputText.Append(inputText.Substring(Match.Index + 1, Match.NextMatch.Index - Match.Index - 1)) 
     Catch ex As Exception 
      outputText.Append(inputText.Substring(Match.Index + 1, inputText.Length - Match.Index - 1)) 
     End Try 
    Next 
14

+1 de los límites de palabra, y aquí es una solución Javascript comparables. Esto también cuenta para los posesivos:

var re = /(\b[a-z](?!\s))/g; 
var s = "fort collins, croton-on-hudson, harper's ferry, coeur d'alene, o'fallon"; 
s = s.replace(re, function(x){return x.toUpperCase();}); 
console.log(s); // "Fort Collins, Croton-On-Hudson, Harper's Ferry, Coeur D'Alene, O'Fallon" 
+0

toUpperCase está capitalizando la palabra completa. Aquí está la solución: s.replace (re, function (x) {return x.charAt (0) .toUpperCase() + x.slice (1);}); – Polopollo

+1

@Polopollo, en este caso, la expresión regular solo devuelve una letra si coincide pero a nivel mundial. Entonces no hay necesidad de esa codificación adicional y debería funcionar como está. –

+0

Esto no funcionará como lo ha pedido OP, ya que un solo carácter no se capitalizaría. Solo para cualquiera que llegue a esta pregunta como yo. –

Cuestiones relacionadas