Напишете главна първата буква на всяка дума в Lua

Мога да напиша главна първата буква от моя низ, използвайки:

str:gsub("^%l", string.upper)

Как мога да променя това, за да изписвам с главна първата буква на всяка дума в низа?


person iRyanBell    schedule 29.11.2013    source източник
comment
От малко гугъл "%f%l"?   -  person OGHaza    schedule 29.11.2013
comment
Не продължавайте %f%l тези регулярни изрази винаги ме карат на нов език.   -  person iRyanBell    schedule 29.11.2013
comment
Добре, едно последно сляпо предположение "%A%l" ‹- бах, току-що разбрах, че дори и това да работи, както си мисля, че може в главата ми, пак няма да пише главна първата буква от низ, а само следващите думи.   -  person OGHaza    schedule 29.11.2013
comment
По близо! %A%l изглежда хваща първата буква от всяка дума, с изключение на първия знак от низа.   -  person iRyanBell    schedule 29.11.2013
comment
Вижте също stackoverflow.com/questions/2421695/.   -  person lhf    schedule 29.11.2013
comment
Оттам взех първия си пример. =]   -  person iRyanBell    schedule 29.11.2013


Отговори (2)


Не успях да намеря някакъв изискан начин да го направя.

str = "here you have a long list of words"
str = str:gsub("(%l)(%w*)", function(a,b) return string.upper(a)..b end)
print(str)

Този изходен код е Тук имате дълъг списък от думи. %w* може да се промени на %w+, за да не се заместват думи от една буква.


По-луксозно решение:

str = string.gsub(" "..str, "%W%l", string.upper):sub(2)

Невъзможно е да се направи истинска замяна на единичен регулярен израз, защото системата за шаблони на lua е проста.

person n1xx1    schedule 29.11.2013
comment
ако имате дума с апостроф, тя също ще направи главна първата буква след апострофа, напр.: ето дълъг списък с изведени думи Ето дълъг списък с думи - опитвам се да намеря поправка - person Joe; 21.03.2014

в изброения алтернативен отговор получавате противоречиви резултати с думи, съдържащи апострофи:

str = string.gsub(" "..str, "%W%l", string.upper):sub(2) ще пише главна първата буква след всеки апостроф, независимо дали това е първата буква в думата

например: "ето дълъг списък от думи" извежда "Ето дълъг списък от думи"

за да поправя това намерих умно решение тук

използвайки този код:

function titleCase( first, rest )
   return first:upper()..rest:lower()
end

string.gsub(str, "(%a)([%w_']*)", titleCase)

ще коригира всички проблеми, причинени от тази странна грешка

person Joe    schedule 21.03.2014
comment
За информация, тази връзка вече не работи, но също така е решение на този чудесен малък лист за измама - person Gamora; 27.06.2019