我正在尝试转换dynamic string
的值,该值可以是abcd-efgh-ijkl
或10.20.AB.20.CD
使用以下功能:
function toTitleCase(str) {
return str.replace(/\w+/g, function (txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});
}
上面的函数可以正常工作并提供输出(我想要为string):Abcd-Efgh-Ijkl
但10.20.AB.20.CD
正在10.20.Ab.20.Cd
中进行转换(我不想要)。
之前:abcd-efgh-ijkl
和10.20.AB.20.CD
之后(使用正则表达式):Abcd-Efgh-Ijkl
和10.20.Ab.20.Cd
期望的解决方案:Abcd-Efgh-Ijkl
和10.20.AB.20.CD
请提出建议。
答案 0 :(得分:2)
您可以使用:
function toTitleCase(str) {
return str.replace(/\b[A-Z0-9]{2}(?:\.[A-Z0-9]{2})*\b|\b([a-zA-Z])([a-zA-Z]*)\b/g, function (txt, $1, $2) {
return $1 ? $1.toUpperCase() + $2.toLowerCase() : txt;
});
}
console.log(toTitleCase("abcd-efgh-ijkl"))
console.log(toTitleCase("10.20.AB.20.CD"))
console.log(toTitleCase("ACdf"))
请参见regex demo
详细信息
\b[A-Z0-9]{2}(?:\.[A-Z0-9]{2})*\b
-一组由点分隔的双字母数字字符,它们将按原样匹配并插入结果中:
\b
-单词边界[A-Z0-9]{2}
-2个字母或数字(?:\.[A-Z0-9]{2})*
-0个序列,依次为.
和2个数字或字母\b
-单词边界|
-或\b
-单词边界([a-z][A-Z])
-第1组(用$1
指代):一封信([a-zA-Z]*)
-第2组(用$2
表示):0+ ASCII字母\b
-单词边界。答案 1 :(得分:2)
首先,您可以进行检查以确认str
没有任何数字,然后相应地处理str
。
详细信息:
!(/\d+/g).test(str)
-确认是否存在无数字
function toTitleCase(str) {
return !(/\d+/.test(str)) ? str.replace(/\w+/g, function(txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
}) : str;
}
console.log(toTitleCase("abcd-efgh-ijkl"))
console.log(toTitleCase("10.20.AB.20.CD"))