使用正则表达式将空间放在驼峰大小写字符串中

时间:2013-03-12 18:46:00

标签: regex

我正在从add a space between two words开始提问。

要求:拆分驼峰案例字符串并在大写字母之前放置空格,后面跟一个小写字母或者可能没有。这个空间不应该在大写字母之间产生。

例如: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 个答案:

答案 0 :(得分:18)

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])子模式匹配的子字符串等。< / p>

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

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

答案 1 :(得分:2)

如果第一个字符始终为小写。

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

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

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

答案 2 :(得分: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();

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

答案 3 :(得分:0)

使用先行/后退的Java驼峰替换:

"TheCapitalOfTheUAEIsAbuDhabi".replace(/([A-Z](?=[a-z]+)|[A-Z]+(?![a-z]))/g, ' $1').trim()
// "The Capital Of The UAE Is Abu Dhabi"