Regex escribe en mayúscula la primera letra de cada palabra, también después de un carácter especial como un guión

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

Ahora muestra:

 This Is A Test For-stackoverflow 

Y quiero esto:

 This Is A Test For-Stackoverflow 

¿Alguna sugerencia / muestra para mí?

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

Una solución simple es usar límites de palabras :

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

Alternativamente, puede hacer coincidir solo unos pocos caracteres:

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

+1 para límites de palabras, y aquí hay una solución de Javascript comparable. Esto explica posesivos, también:

 var re = /(\b[az](?!\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" 

En realidad, no es necesario que coincida con la cadena completa simplemente coincida con la primera letra que no sea mayúscula como esta:

 '~\b([az])~' 

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

esto hará

REAC De Boeremeakers

de

Rea de boeremeakers

 (?< =\A|[ .])(?[az])(?=[az. ]) 

utilizando

  Dim matches As MatchCollection = Regex.Matches(inputText, "(?< =\A|[ .])(?[az])(?=[az. ])") 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