如何使用正则表达式转换字符串而不转换为数字的字母?

时间:2018-10-19 14:06:58

标签: javascript regex

我正在尝试转换dynamic string的值,该值可以是abcd-efgh-ijkl10.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-Ijkl10.20.AB.20.CD正在10.20.Ab.20.Cd中进行转换(我不想要)。

之前abcd-efgh-ijkl10.20.AB.20.CD

之后(使用正则表达式)Abcd-Efgh-Ijkl10.20.Ab.20.Cd

期望的解决方案Abcd-Efgh-Ijkl10.20.AB.20.CD

请提出建议。

2 个答案:

答案 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"))