web-dev-qa-db-fra.com

Regex majuscule la première lettre de chaque mot, même après un caractère spécial comme un tiret

J'utilise ce #(\s|^)([a-z0-9-_]+)#i pour mettre en majuscule chaque première lettre chaque mot, je le veux aussi pour mettre en majuscule la lettre si c'est après une marque spéciale comme un tiret (-)

Maintenant cela montre:

This Is A Test For-stackoverflow

Et je veux ceci:

This Is A Test For-Stackoverflow

Des suggestions/échantillons pour moi?

Je ne suis pas un pro, alors essayez de garder les choses simples pour que je puisse comprendre.

24
Simmer

Une solution simple consiste à utiliser Limites de mots :

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

Alternativement, vous pouvez faire correspondre quelques caractères seulement:

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

+1 pour les limites de mots, et voici une solution Javascript comparable. Cela représente aussi les possessifs:

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"
18
NotNedLudd

En fait, il n'est pas nécessaire que la chaîne complète corresponde à la première lettre non majuscule comme ceci:

'~\b([a-z])~'
6
anubhava

cela fera

R.E.A.C De Boeremeakers  

de 

r.e.a.c de boeremeakers

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

en utilisant

    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
0
Sedecimdies

Voici ma solution Python

>>> import re
>>> the_string = 'this is a test for stack-overflow'
>>> re.sub(r'(((?<=\s)|^|-)[a-z])', lambda x: x.group().upper(), the_string)
'This Is A Test For Stack-Overflow'

lire sur le "lookbehind positif" ici: https://www.regular-expressions.info/lookaround.html

0
nmz787

Essayez #([\s-]|^)([a-z0-9-_]+)#i - le (\s|^) correspond à un espace (\s) ou au début de la ligne (^). Lorsque vous modifiez le \s en [\s-], il correspond à tout caractère d'espacement ou à un tiret.

0
Shadikka