在大写字母前插入空格

149

我有一个字符串"MySites",我想在MySites之间加上一个空格。

在jQuery或JavaScript中怎样做呢?


1
你能提供更多细节吗?你想要分离的字符串的一般形式是什么?如果只有一个字符串,为什么不手动添加空格呢? - Pointy
2
请更加精确明确,我认为没有人能够理解你所提出的问题。 - Clement Herreman
1
定义它应该匹配的模式,例如“在字符串中找到'My'时添加一个空格”或“在每个大写字符之前添加一个空格,除非它是第一个字符”,或...。 - JohnSmith
"在我的网站之间"。你如何在两个单词之间放置一个空格?我猜你想要"我的网站"作为输出结果。 - gen_Eric
#meagar -- 很好的评论(讽刺)。你从未被教过如果没有什么好话可说,就不要说话吗? - carinlynchin
9个回答

266

你可以在每个大写字母前添加一个空格,并去掉开头和结尾的空格。

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

这也适用于“1AndAbove”。另一个解决方案不行。谢谢! - One-One
2
它在处理首字母缩写时会“失败”,我们如何防止它在连续两个或更多大写字母时执行操作? - Toni Michel Caubet
9
很容易,将正则表达式修改为这样:/([A-Z]+)/g。加号可以确保匹配尽可能多的连续大写字母。 - iFreilicht
为什么在这段代码中需要用括号来包围 '[A-Z]'? - Kristina Bressler
3
(括号内)表示“我是一个变量”。没有括号,它会返回“MySites”的答案“$1y $1ites”。 - user2051552

148

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

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

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

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

4
警告:此方法不适用于单个字母,例如"ThisIsATest"会输出为"This Is ATest"。 - Ceres
4
@Ceres:说得好。这种情况可以通过在任何不是第一个字符的大写字母前插入一个空格来处理,但是还有一些情况是不能没有单词识别而处理的,比如“RunThisSQLQuery”。 - Guffa
1
对于"ThisIsATest"(不包括'RunThisSQLQuery'),你可以这样做:str.replace(/([A-Z])/g, ' $1').trim() - carinlynchin
太棒了!谢谢! - Ami Schreiber

37

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

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

如果您在处理数据库列名(并且在某些情况下使用缩写),这可能会更有用一些。


4
这对我所需的完美奏效。它在大写字母之间添加了一个空格,但保持首字母缩略词不变。 - mighty_mite

10

这是我最终使用的代码,将字符串转换为标题大小写,基于这里的一些答案:

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" -> "Your String Here"
  • "AnotherStringHere" -> "Another String Here"
  • "someones_string" -> "Someones String"
  • "Another-String-Here" -> "Another String Here"
  • "myAWESOMEString" -> "My AWESOME String"

目前而言,substr()已经被弃用了,有没有这个方法的替代品? - Maidenless

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(); })

5

正则表达式用于查找小写字母和大写字母之间的边界,然后插入一个空格。

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

http://jsfiddle.net/uXy64/


4
这是另一种可能性,要紧凑得多。
export function replaceCamelSpaces(colorName){
   return colorName.replace(/\B([A-Z])\B/g, ' $1');
}

解释:

\B 是大写单词边界,用于查找,更多信息请阅读这里

([A-Z]) 查找零个、一个或多个大写字母的出现次数

\B 与之前一样,但在搜索结束时使用

/g 匹配所有先前匹配的出现次数

替换为

' $1'

以某个字母(小写)和空格开头替换


4
在单个正则表达式替换中(不包括修剪或连接),允许任何字符,而不仅仅是字母[a-z][A-Z]
const str = "MySites";
str.replace(/(?<!^)([A-Z])/g, " $1"); // -> "My Sites"

你可以在这里了解更多有关于 (?<!^) 的用法。
编辑:
添加全局标志/g以进行多次替换。

1
如果您添加 g 标志,正则表达式也将适用于相邻的大写字母。'ThisIsATest'.replace(/(?<!^)([A-Z])/g, ' $1') === 'This Is A Test' - Nitsan BenHanoch
@NitsanBenHanoch 很好的发现,我忘记了全局搜索标志。 - Jose Da Silva

3
你可以使用 String#split() 方法以及正则表达式中的预查(look-ahead)来匹配大写字母([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());


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接