Regex загладить первую букву каждое слово, также после специального символа, как тире

Я использую этот #(\s|^)([a-z0-9-_]+)#i для того, чтобы загладить каждую первую букву каждое слово, я хочу, чтобы она также заглавную букву, если после специальной отметки, как тире (-)

Теперь он показывает:

This Is A Test For-stackoverflow

И я хочу это:

This Is A Test For-stackoverflow

Любые предложения/образцы для меня?

Я не профессионал, поэтому постарайся понять это просто для меня.

Ответ 1

Простым решением является использование границ слов:

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

В качестве альтернативы вы можете совместить только несколько символов:

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

Ответ 2

+1 для границ слов, а вот сопоставимое решение Javascript. Это объясняет и обладателей:

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

Ответ 3

На самом деле не нужно совпадать с полной строкой, просто совпадающей с первой буквой, отличной от прописной, например:

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

Ответ 4

Попробуйте #([\s-]|^)([a-z0-9-_]+)#i - (\s|^) соответствует пробельному символу (\s) или началу строки (^). Когда вы меняете \s на [\s-], он соответствует любому символу пробела или тире.

Ответ 5

это сделает

R.E.A.C De Boeremeakers

из

r.e.a.c de boeremeakers

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

используя

    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

Ответ 6

Здесь мое решение 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'

Прочтите о "позитивном взгляде" здесь: https://www.regular-expressions.info/lookaround.html