在大写字母前插入空格


95

我有绳子"MySites"。我想在My和之间放置一个空格Sites

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


1
您能否提供更多细节?您要分离的字符串的一般形式是什么?如果只有一个字符串,为什么不直接手动输入空格呢?
Pointy

2
请更准确地说,我认为没有人能理解您的要求
Clement Herreman

1
定义,它应该匹配,如或“资本的每个字符前加一个空格,除非它是第一个字符”,或者......“当发现‘我’在字符串中的空间”的格局
JohnSmith对

“在MySites之间”。如何在1件事之间放置一个空格?我假设您希望将“我的网站”作为输出。
火箭Hazmat

#meagar-不错的评论(讽刺)。您是否曾经教过,如果您无话可说,什么也不要说?
carinlynchin

Answers:


163

您可以在每个大写字符之前添加一个空格,并修剪前导和尾随空格

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

这也适用于“ 1AndAbove”。其他解决方案则没有。谢谢!!
desaivv

1
首字母缩略词“失败”,当连续2个或更多大写字母时,如何防止它起作用?
托尼·米歇尔·考贝特

3
@ToniMichelCaubet简单,像这样修改正则表达式:/([A-Z]+)/g。+将确保您匹配尽可能多的连续大写字母。
iFreilicht

为什么在此代码中需要用括号括住“ [AZ]”?
克里斯蒂娜·贝雷斯勒

@Kristina括号说“我是变量”。如果没有括号,它将为“ MySites”生成答案“ $ 1y $ 1ites”
user2051552 '17

127

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

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

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

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

3
只是警告,这对于单个字母“ ThisIsATest”失败,将导致“ This Is ATest”。
Ceres 2014年

3
@Ceres:好点。可以通过在不是首个字符的任何大写字母之前插入空格来解决这种情况,但是您仍然遇到没有单词识别就无法处理的情况,例如"RunThisSQLQuery"
Guffa 2014年

1
对于“ ThisIsATest”-(不计算“ RunThisSQLQuery”),您可以这样做:str.replace(/([AZ])/ g,'$ 1')。trim()
carinlynchin

辉煌!谢谢!
阿米·施莱伯

21

可能我建议对当前接受的答案进行一些修改:

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

如果您正在处理数据库列名称(并且在某些情况下使用首字母缩写词),这可能会稍微有用些。


1
这完全可以满足我的需求。它完美地在大写字母之间添加了一个空格,但首字母缩略词保持在一起。
mayy_mite 2016-09-14

6

这应该在每个大写字母之间插入一个空格,该空格之前不能使用大写字母。

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转换为Regular Form

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


2

根据这里的一些答案,这是我最终用来将字符串转换为标题大小写的内容:

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 String”
  • “这里的另一个字符串”->“这里的另一个字符串”
  • “ myAWESOMEString”->“我的AWESOME String”

1

您可以使用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());


1

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

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

您可以在(?<!^) 此处查看有关其外观的更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.