【问题标题】:Insert space before capital letters在大写字母前插入空格
【发布时间】:2011-07-31 17:36:11
【问题描述】:

我有一个字符串"MySites"。我想在MySites 之间放置一个空格。

如何在 jQuery 或 JavaScript 中做到这一点?

【问题讨论】:

  • 你能提供更多细节吗?您要分离的字符串的一般形式是什么?如果只有那一个字符串,为什么不手动输入空格呢?
  • 请准确一点,我认为没有人能理解你在问什么
  • 定义它应该匹配的模式,例如“在字符串中找到'My'时的空格”或“在每个大写字符之前添加一个空格,除非它是第一个字符”,或者....
  • “在我的站点之间”。你怎么能在 1 件事之间放置一个空格?我假设您希望“我的网站”作为输出。
  • #meagar -- 好评论(讽刺)。你有没有教过,如果你没有什么好说的,就什么也不说?

标签: javascript jquery regex string replace


【解决方案1】:

根据此处的一些答案,我最终将字符串转换为标题大小写:

str = str
  .replace(/(_|-)/g, ' ')
  .trim()
  .replace(/\w\S*/g, function(str) {
    return str.charAt(0).toUpperCase() + str.substr(1)
  })   
  .replace(/([a-z])([A-Z])/g, '$1 $2')
  .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')   

这是一个 JSFiddle,您可以在其中测试您的字符串,看看这是否满足您的需求: https://jsfiddle.net/thomastasa/5236dv8t/85/


例子:

  • “yourStringHere”->“你的字符串”
  • “AnotherStringHere”->“另一个字符串”
  • "someones_string" -> "Someones 字符串"
  • “另一个字符串”->“另一个字符串”
  • “myAWESOMEString”->“我的真棒字符串”

【讨论】:

    【解决方案2】:

    在单个正则表达式替换(没有修剪或连接)中,允许任何字符,而不仅仅是字母 [a-z][A-Z]

    const str = "MySites";
    str.replace(/(?<!^)([A-Z])/, " $1"); // -> "My Sites"
    

    您可以查看更多关于 (?&lt;!^) here 背后的外观。

    【讨论】:

      【解决方案3】:

      您可以使用 String#split() 和大写字母 ([A-Z]) 的前瞻,然后使用带有空格的数组 Array#join()

      let stringCamelCase = "MySites";
      
      let string = stringCamelCase.split(/(?=[A-Z])/).join(" ");
      
      console.log(string)

      或者,作为字符串对象函数:

      String.prototype.cC2SC = function() {
        return this.split(/(?=[A-Z])/).join(" ");
      }
      
      console.log("MyCamelCase".cC2SC());

      【讨论】:

        【解决方案4】:

        这将查找每个出现的小写字符后跟一个大写字符,并在它们之间插入一个空格:

        s = s.replace(/([a-z])([A-Z])/g, '$1 $2');
        

        对于出现 2 个连续大写字母的特殊情况(例如:ThisIsATest),请在下面添加附加代码:

         s = s.replace(/([A-Z])([A-Z])/g, '$1 $2');
        

        【讨论】:

        • 只是一个警告,这对于单个字母“ThisIsATest”失败将导致“This Is ATest”。
        • @Ceres:好点子。可以通过在不是第一个字符的任何大写字母之前插入一个空格来处理这种情况,但是您仍然有一些在没有单词识别的情况下无法处理的情况,例如"RunThisSQLQuery"
        • 对于“ThisIsATest”——(不包括“RunThisSQLQuery”)你可以这样做:str.replace(/([AZ])/g, '$1').trim()
        • 太棒了!谢谢!
        【解决方案5】:

        我是否可以建议对当前接受的答案稍作修改:

        function insertSpaces(string) {
            string = string.replace(/([a-z])([A-Z])/g, '$1 $2');
            string = string.replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
            return string;
        }
        

        这意味着:

        ACROText -> ACRO Text
        UserNameTest -> User Name Test
        

        如果您正在处理 db 列名(并且在某些事情上使用首字母缩写词),这可能会稍微有用一些

        【讨论】:

        • 这非常适合我的需要。它完美地在大写字母之间添加了一个空格,但将首字母缩略词保持在一起。
        【解决方案6】:

        您可以在每个大写字符前添加一个空格并去掉前导和尾随空格

        s = s.replace(/([A-Z])/g, ' $1').trim()
        

        【讨论】:

        • 这也适用于“1AndAbove”。另一个解决方案没有。谢谢!!
        • 首字母缩略词“失败”,我们如何防止它在 2 个或更多连续大写字母时起作用?
        • @ToniMichelCaubet 简单,像这样修改正则表达式:/([A-Z]+)/g。 + 将确保您匹配尽可能多的连续大写字母。
        • 为什么在这段代码中需要用括号括住“[A-Z]”?
        • @Kristina 括号说“我是一个变量”。如果没有括号,它会为“MySites”生成答案“$1y $1ites”
        【解决方案7】:

        这应该在每个大写字母之间插入一个空格,并且前面没有大写字母。

        var myString = "MySites"
        var newString = "";
        var wasUpper = false;
        for (var i = 0; i < myString.length; i++)
        {
            if (!wasUpper && myString[i] == myString.toUpperCase()[i])
            {
                newString = newString + " ";
                wasUpper = true;
            }
            else
            {
                wasUpper = false;
            }
            newString = newString + myString[i];
        }
        

        newString 将具有您想要的值。另外,如果您想使用正则表达式缩短代码,可以使用Javascript camelCase to Regular Form中的以下代码

        "thisStringIsGood"
            // insert a space before all caps
            .replace(/([A-Z])/g, ' $1')
            // uppercase the first character
            .replace(/^./, function(str){ return str.toUpperCase(); })
        

        【讨论】:

          【解决方案8】:

          正则表达式查找小写 - 大写边界然后插入空格

          <div id='x'>ThisIsMySites</div>
          $('#x').text( $('#x').text().replace(/([a-z])([A-Z])/g, "$1 $2") );
          

          http://jsfiddle.net/uXy64/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-31
            • 2022-12-10
            • 2019-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多