js 正则替换实现特殊分隔符的单词首字母大写

在 js 里面,实现单词的首字母大写非常简单,直接用一个replace函数即可,如下代码:

function toTitleCase(str) {
  return str.replace(
    /\w\S*/g,
    function(txt) {
      return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    }
  );
}

上面的代码,可以实现空格分隔的单词转换,但如果不是空格分隔的单词,就直接不生效了,如下 case 的2,3,4 案例,就不能正确转换 :

  1. this is cat 正常case
  2. this_is_cat 全部下划线的case
  3. this-is-cat 全部连字符的case
  4. this_is-cat 下划线和连字符混合的case

原因在于:\w 是匹配的 字母、数字、下划线。等价于'[A-Za-z0-9_]',而这里面恰恰有我们作为界定符的下划线,所以如果想要兼容 2,3,4 的情况,就需要改进正则表达式,最后的修改如下:

        function toTitleCase(str) {
            return str.replace(
                /[a-zA-Z]*[_\s-]*/g,
                function(txt) {
                    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
                }
            )
        }

关键在于:/[a-zA-Z]*[_\s-]*/g 这个正则表达式,解释一下:

[a-zA-Z]* 第一部分匹配任意 0个或多个字母组成的单词

[_\s-]* 第二部分是接着第一部分结果的追加限定:必须以 0个或多个 (下划线 或 空白字符 或 连字符)组成部分结尾才可以

这里面需要注意:[_\s-] 的顺序,连字符不能放中间,因为放空间表示一个范围,会导致编译报错

你可能感兴趣的:(前端,Java,javascript,开发语言,ecmascript,正则表达式)