正则表达式将每个单词的首字母大写,也可以在像破折号这样的特殊字符之后

Sim*_*mer 24 regex letter capitalize

我使用它#(\s|^)([a-z0-9-_]+)#i来为每个单词的每个首字母大写,我希望它也可以大写字母,如果它是在一个特殊标记之后,如破折号( - )

现在它显示:

This Is A Test For-stackoverflow
Run Code Online (Sandbox Code Playgroud)

我想要这个:

This Is A Test For-Stackoverflow
Run Code Online (Sandbox Code Playgroud)

对我有什么建议/样品吗?

我不是专业人士,所以尽量让我理解.

Kob*_*obi 20

一个简单的解决方案是使用单词边界:

#\b[a-z0-9-_]+#i
Run Code Online (Sandbox Code Playgroud)

或者,您可以匹配几个字符:

#([\s\-_]|^)([a-z0-9-_]+)#i
Run Code Online (Sandbox Code Playgroud)

  • @Tim - 我采取了艺术自由,并没有改变OP匹配字母的方式 - 这是*可能*Simmer希望字母作为输出,改变他们的颜色或诸如此类.而且,没有多想,我只有4分钟`:P` (2认同)

小智 20

字边界为+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"
Run Code Online (Sandbox Code Playgroud)

  • @Polopollo,在这种情况下,正则表达式只返回一个字母,如果匹配但全局.因此,不需要额外的编码,它应该按原样工作. (2认同)
  • 我担心这不起作用:单词边界包括诸如 '. 所以“不要”变成了“不要” (2认同)

Jai*_*man 14

如果您想使用纯正则表达式,则必须使用\u.

要转换该字符串:

这是一个针对 stackoverflow 的测试

进入

这是一个 Stackoverflow 测试

您必须输入: (.+)-(.+)以捕获“-”之前和之后的值,然后要替换它,您必须输入:

$1-\u$2

如果是在 bash 中,你必须输入:

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


anu*_*ava 7

实际上不需要匹配完整的字符串只匹配第一个非大写字母,如下所示:

'~\b([a-z])~'
Run Code Online (Sandbox Code Playgroud)

  • 在js中,我添加了`g`,如`/\b([az])/ g`来大写每个单词 (3认同)