Regex использует заглавные буквы в каждом слове, также после специального символа, такого как тире - PullRequest
24 голосов
/ 06 июня 2011

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

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

This Is A Test For-stackoverflow

И я хочу это:

This Is A Test For-Stackoverflow

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

Я не профессионал, поэтому постарайтесь, чтобы мне было проще.

Ответы [ 6 ]

20 голосов
/ 06 июня 2011

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

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

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

#([\s\-_]|^)([a-z0-9-_]+)#i
19 голосов
/ 25 апреля 2015

+ 1 для границ слов, и вот сопоставимое решение Javascript.Это касается и притяжательных персонажей:

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"
7 голосов
/ 06 июня 2011

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

'~\b([a-z])~'
0 голосов
/ 19 января 2019

Вот мое решение 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

0 голосов
/ 17 сентября 2013

это будет составлять

REAC De Boeremeakers

из

Reaction 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
0 голосов
/ 06 июня 2011

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

...