我使用这个#(\s|^)([a-z0-9-_]+)#i
来为每个单词的每个首字母大写,我希望它也可以将字母大写,如果它是在一个特殊标记之后,如短划线( - )
现在显示:
This Is A Test For-stackoverflow
我想要这个:
This Is A Test For-Stackoverflow
对我有任何建议/样品吗?
我不是专业人士,所以尽量让我理解。
答案 0 :(得分:19)
答案 1 :(得分:19)
+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"
答案 2 :(得分:7)
实际上不需要匹配完整字符串只匹配第一个非大写字母,如下所示:
'~\b([a-z])~'
答案 3 :(得分:2)
我使用 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
[a-zÁ-ú]
这里我考虑了字母表中的所有字母,包括大写字母和带重音的字母。
例如:sábado de Janeiro às 19h。 sexta-feira de janeiro às 21 e horas[a-zÁ-ú]{3,}
所以我要删除一些不够大的字母\b([a-zÁ-ú]{3,})
最后我只保留完整的单词。必须使用 () 来隔离最后一个表达式才能工作。实现这一点后,我只将更改应用于小写的单词
string.charAt(0).toUpperCase() + w.slice(1); // output -> Output
两者兼而有之
str.replace(/\b(([a-zÁ-ú]){3,})/g, (w) => w.charAt(0).toUpperCase() + w.slice(1));
结果:
Sábado de Janeiro às 19h。 Sexta-Feira de Janeiro às 21 e Horas
答案 4 :(得分:1)
对于JavaScript,这是一种适用于不同语言和字母的解决方案:
const originalString = "this is a test for-stackoverflow"
const processedString = originalString.replace(/(?:^|\s|[-"'([{])+\S/g, (c) => c.toUpperCase())
它匹配任何以字符串\S
,空格^
或任何字符\s
开头的非空白字符-"'([{
,以及用大写字母替换它。
答案 5 :(得分:0)
尝试#([\s-]|^)([a-z0-9-_]+)#i
- (\s|^)
匹配空格字符(\s
)或行的开头(^
)。当您将\s
更改为[\s-]
时,它会匹配任何空白字符或短划线。
答案 6 :(得分:0)
这将使
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
答案 7 :(得分:0)
这是我的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
答案 8 :(得分:0)
如果要使用纯正则表达式,则必须使用 \u
。
要转换此字符串:
这是堆栈溢出测试
进入
这是堆栈溢出测试
您必须输入:
(.+)-(.+)
捕获“-”之前和之后的值
然后要替换它,您必须输入:
$1-\u$2
如果它是bash,则必须放置:
echo "This Is A Test For-stackoverflow" | sed 's/\(.\)-\(.\)/\1-\u\2/'