Регулярное выражение делает первую букву каждого слова заглавной, а также после специального символа, такого как тире.

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

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

This Is A Test For-stackoverflow

И я хочу это:

This Is A Test For-Stackoverflow

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

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


person Simmer    schedule 06.06.2011    source источник
comment
Вам также нужно использовать заглавные буквы, отличные от ASCII (à, ü и т. д.)? Какой язык вы используете?   -  person Tim Pietzcker    schedule 06.06.2011
comment
О регулярном выражении какого языка вы спрашиваете?   -  person JohnK    schedule 22.06.2017


Ответы (8)


+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"
person NotNedLudd    schedule 24.04.2015
comment
toUpperCase пишет все слово с большой буквы. Вот решение: s.replace(re, function(x){return x.charAt(0).toUpperCase() + x.slice(1);}); - person Polopollo; 09.05.2016
comment
@Polopollo, в этом случае регулярное выражение возвращает только одну букву, если она совпадает, но глобально. Таким образом, нет необходимости в этом дополнительном кодировании, и он должен работать как есть. - person adam-beck; 26.04.2017
comment
Это не сработает, как просил OP, поскольку ни один символ не будет заглавным. Просто для тех, кто приходит к этому вопросу, как и я. - person adam-beck; 26.04.2017
comment
Боюсь, это не сработает: границы слов включают такие вещи, как '. Итак, don't становится Don'T - person Anderas; 13.04.2018
comment
@Anderas Андерас, вот для чего нужен отрицательный просмотр: (?!\s) проверяет, не является ли это символом перед пробелом. С другой стороны, это не удается, когда за таким словом, как don't, следует непробельный, небуквенно-цифровой символ, такой как запятая, точка или восклицательный знак. Было бы лучше использовать границу слова в предпросмотре: /(\b[a-z](?!\b))/g; - person Guido Bouman; 03.05.2018
comment
@GuidoBouman: предложенное вами регулярное выражение не работает для Coeur D'Alene и O'Fallon. - person davemyron; 23.05.2019

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

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

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

#([\s\-_]|^)([a-z0-9-_]+)#i
person Kobi    schedule 06.06.2011
comment
Спасибо! Работает как шарм! - person Simmer; 06.06.2011
comment
@Tim - я воспользовался художественной свободой и не изменил способ сопоставления букв OP - это возможно Симмер хочет, чтобы буква была на выходе, меняла их цвета или еще что-то. Кроме того, я не особо задумывался об этом, у меня было всего 4 минуты :P - person Kobi; 06.06.2011
comment
Может кто-нибудь добавить пример jsfiddle, который будет полезен - person Pravin Waychal; 09.06.2016
comment
Для какого языка это регулярное выражение? - person JohnK; 22.06.2017
comment
@JohnK - оба они достаточно просты и должны работать на всех языках. # здесь является разделителем, поэтому вашему языку может понадобиться "\\b[a-z0-9-_]+" и флаг IgnoreCase. - person Kobi; 22.06.2017

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

'~\b([a-z])~'
person anubhava    schedule 06.06.2011
comment
в js я добавил g, например /\b([a-z])/g, чтобы каждое слово было заглавным - person Stalin Gino; 06.12.2014
comment
мне нравится ваш прекрасный ответ @StalinGino должен сказать, что это единственный, который я смог понять. - person Danish; 08.02.2016
comment
То есть согласно требованиям. Проверьте также все остальные ответы. - person anubhava; 24.05.2020

Вот решение для JavaScript, которое работает на разных языках и алфавитах:

const originalString = "this is a test for-stackoverflow"
const processedString = originalString.replace(/(?:^|\s|[-"'([{])+\S/g, (c) => c.toUpperCase())

Он соответствует любому непробельному символу \S, которому предшествует начало строки ^, пробел \s или любой из символов -"'([{, и заменяет его вариантом в верхнем регистре.

person Michael Schmid    schedule 23.05.2020

Если вы хотите использовать чистые регулярные выражения, вы должны использовать метод \u.

Чтобы преобразовать эту строку:

Это тест для stackoverflow

в

Это тест для Stackoverflow

Вы должны поставить: (.+)-(.+) для захвата значений до и после - затем, чтобы заменить его, вы должны поставить:

$1-\u$2

Если это в bash, вы должны поставить:

echo "This Is A Test For-stackoverflow" | sed 's/\(.\)-\(.\)/\1-\u\2/'

person Jaime Roman    schedule 17.12.2020

мое решение с использованием javascript

function capitalize(str) {
  var reg = /\b([a-zÁ-ú]{3,})/g;
  return string.replace(reg, (w) => w.charAt(0).toUpperCase() + w.slice(1));
}

с es6 + javascript

const capitalize = str => 
    str.replace(/\b([a-zÁ-ú]{3,})/g, (w) => w.charAt(0).toUpperCase() + w.slice(1));



/<expression-here>/g
  1. [a-zÁ-ú] здесь я считаю все буквы алфавита, в том числе заглавные и с ударением. пример: sábado de Janeiro às 19h. sexta-feira de janeiro às 21 e horas
  2. [a-zÁ-ú]{3,} поэтому я собираюсь удалить некоторые буквы, которые недостаточно велики
    например: sábado de Janeiro às 19h. sexta-feira от janeiro до 21 и horas
  3. \b([a-zÁ-ú]{3,}) наконец, я оставляю только те слова, которые выбраны полностью. Необходимо использовать (), чтобы изолировать последнее выражение для работы.
    пример: sábado de Janeiro às 19h. sexta-feira от janeiro до 21 и horas

после достижения этого я применяю изменения только к словам в нижнем регистре

string.charAt(0).toUpperCase() + w.slice(1); // output -> Output

присоединиться к двум

str.replace(/\b(([a-zÁ-ú]){3,})/g, (w) => w.charAt(0).toUpperCase() + w.slice(1));

результат:
Сабадо де Жанейро в 19:00. Sexta-Feira de Janeiro às 21 e Horas

person Thiago Alves    schedule 22.01.2021

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

person nmz787    schedule 18.01.2019

это сделает

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
person Sedecimdies    schedule 17.09.2013