15

我的问题是在两个单词之间添加一个空格

要求:拆分驼峰式字符串并在大写字母前放置空格,后跟小写字母,或者什么都没有。大写字母之间不应出现空格。

例如:CSVFilesAreCoolButTXT是一个字符串,我想以这种方式产生它CSV Files Are Cool But TXT

我是这样开普通快车的:

"LightPurple".replace(/([a-z])([A-Z])/, '$1 $2')

如果你有两个以上的单词,那么你需要使用 g 标志来匹配它们。

"LightPurpleCar".replace(/([a-z])([A-Z])/g, '$1 $2')

如果要尝试拆分单词,CSVFile那么您可能需要使用此正则表达式:

"CSVFilesAreCool".replace(/([a-zA-Z])([A-Z])([a-z])/g, '$1 $2$3')

但它仍然不能满足我提出要求的方式。

4

5 回答 5

25
var rex = /([A-Z])([A-Z])([a-z])|([a-z])([A-Z])/g;

"CSVFilesAreCoolButTXT".replace( rex, '$1$4 $2$3$5' );
// "CSV Files Are Cool But TXT"

并且

"CSVFilesAreCoolButTXTRules".replace( rex, '$1$4 $2$3$5' );    
// "CSV Files Are Cool But TXT Rules"

匹配正则表达式模式的主题字符串的文本将被替换字符串替换'$1$4 $2$3$5',其中$1$2指的是与模式的捕获组匹配的子字符串()

$1指第一([A-Z])个子模式$3匹配的子串,指第一个子模式匹配的子串([a-z])等。

由于交替字符|,要进行匹配,正则表达式必须匹配([A-Z])([A-Z])([a-z])子模式或([a-z])([A-Z])子模式,因此如果进行匹配,则多个捕获组将保持不匹配。这些捕获组可以在替换字符串中引用,但它们对它没有影响 - 实际上,它们将引用一个空字符串。

替换字符串中的空格确保每次匹配时都会在主题字符串中插入一个空格(尾随g标志意味着正则表达式引擎将查找多个匹配项)。

于 2013-03-12T19:49:06.297 回答
6

如果第一个字符总是小写。

'camelCaseString'.replace(/([A-Z]+)/g, ' $1')

如果第一个字符是大写的。

'CamelCaseString'.replace(/([A-Z]+)/g, ' $1').replace(/^ /, '')
于 2018-04-24T12:50:41.563 回答
2

在 .NET 中使用正则表达式拆分 CamelCase:

Regex.Replace(input, "((?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z]))", " $1").Trim();

例子 :

Regex.Replace("TheCapitalOfTheUAEIsAbuDhabi", "((?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z]))", " $1").Trim();

输出: 阿联酋的首都是阿布扎比

于 2018-07-03T11:54:43.067 回答
1

这对我有用

let camelCase = "CSVFilesAreCoolButTXTRules"
let re = /[A-Z-_\&](?=[a-z0-9]+)|[A-Z-_\&]+(?![a-z0-9])/g
let delimited = camelCase.replace(re,' $&').trim()

上面的代码适用于我拥有的几乎所有用例。我有一些特殊之处,其中 '&' 和 '_' 应该被视为等同于大写字符

  • ThisIsASlug ---> 这是一个蛞蝓
  • loremIpsum ---> lorem Ipsum
  • PAGS_US ---> PAGS_US
  • TheCapitalOfTheUAEIsAbuDhabi ---> 阿联酋的首都是阿布扎比
  • eclipseRCPExt ---> Eclipse RCP Ext
  • 价值--->价值
  • SG&A ---> SG&A

简要说明

[A-Z-_\&](?=[a-z0-9]+)
//Matches normal words i.e. one uppercase followed by one or more non-uppercase characters 


[A-Z-_\&]+(?![a-z0-9]) 
//Matches acronyms & abbreviations i.e. a sequence of uppercase characters that are not followed by non-uppercase characters

在这里查看正则表达式小提琴

于 2021-11-13T03:33:11.390 回答
0

使用lookaheads / behinds替换Javascript的驼峰式:

"TheCapitalOfTheUAEIsAbuDhabi".replace(/([A-Z](?=[a-z]+)|[A-Z]+(?![a-z]))/g, ' $1').trim()
// "The Capital Of The UAE Is Abu Dhabi"
于 2019-11-13T21:17:58.557 回答