将camelCaseText转换为句子案例文本

Hyd*_*erA 117 javascript regex string

如何在JavaScript中将'helloThere'或'HelloThere'之类的字符串转换为'Hello There'?

Zen*_*ter 149

var text = 'helloThereMister';
var result = text.replace( /([A-Z])/g, " $1" );
var finalResult = result.charAt(0).toUpperCase() + result.slice(1);
console.log(finalResult);
Run Code Online (Sandbox Code Playgroud)

注意空间" $1".

编辑:添加了第一个字母的大写的示例.当然,如果第一个字母已经是大写字母 - 您将有一个空余可以删除.

  • uSBPorts => USB端口,不是我的预期,我想要一个USB端口 (6认同)
  • @signonsridhar Man,如果有人将小写的“usb ports”写为“uSBPorts”,我会从他们的键盘上偷走shift键。我希望它是“usbPorts”。在“theUSA”这样的情况下,您可以有一个选项,例如“consecutiveCapsMode”,具有不同的模式:例如“lower”和“split”。然后 `camelToSentence('theUSA', { ContinuousCapsMode: 'lower' })` 应该返回 `theUsa` 等。 (3认同)

Wto*_*wer 86

或者使用lodash:

lodash.startCase(str);
Run Code Online (Sandbox Code Playgroud)

例:

_.startCase('helloThere');
// ? 'Hello There'
Run Code Online (Sandbox Code Playgroud)

Lodash是一个很好的图书馆给快捷方式到许多日常JS tasks.There很多其他类似的字符串处理函数,例如camelCase,kebabCase等等.

  • 每当我想到“lodash 不可能也能做到这一点”时,它确实做到了。 (7认同)

Jam*_*ury 46

我遇到了类似的问题,并按照以下方式处理:

stringValue.replace(/([A-Z]+)*([A-Z][a-z])/g, "$1 $2")
Run Code Online (Sandbox Code Playgroud)

对于更强大的解决方案:

stringValue.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1")
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/PeYYQ/

输入:

 helloThere 
 HelloThere 
 ILoveTheUSA
 iLoveTheUSA
Run Code Online (Sandbox Code Playgroud)

输出:

 hello There 
 Hello There 
 I Love The USA
 i Love The USA
Run Code Online (Sandbox Code Playgroud)

  • 这不是OP所要求的句子大小写。第一个字母应大写。 (6认同)
  • 此外,它在单词之间添加了额外的空格 (2认同)

ren*_*ark 26

没有副作用的例子.

function camel2title(camelCase) {
  // no side-effects
  return camelCase
    // inject space before the upper case letters
    .replace(/([A-Z])/g, function(match) {
       return " " + match;
    })
    // replace first char with upper case
    .replace(/^./, function(match) {
      return match.toUpperCase();
    });
}
Run Code Online (Sandbox Code Playgroud)

在ES6中

const camel2title = (camelCase) => camelCase
  .replace(/([A-Z])/g, (match) => ` ${match}`)
  .replace(/^./, (match) => match.toUpperCase());
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,这会在句子的开头添加额外的空格. (3认同)

Chr*_*ine 12

我发现用于测试驼峰案例到标题案例函数的最佳字符串是这个荒谬的荒谬的例子,它测试了许多边缘情况.据我所知,之前发布的函数都没有正确处理:

ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D

这应该转换为:

及时获取您的GED关于26个ABC的歌曲是本质的但是用户456的个人ID卡在包含ABC的26A房间26次并不像C3PO或R2D2或2R2D那样容易

如果你只想要一个处理上述情况的简单函数(以及比以前的许多答案更多的情况),这就是我写的那个.这段代码不是特别优雅或快速,但它简单易懂,易于理解.

它的在线可运行示例如下:http://jsfiddle.net/q5gbye2w/56/

// Take a single camel case string and convert it to a string of separate words (with spaces) at the camel-case boundaries.
// 
// E.g.:
//    ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D
//                                                  --> To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D
//    helloThere                              --> Hello There
//    HelloThere                              --> Hello There 
//    ILoveTheUSA                             --> I Love The USA
//    iLoveTheUSA                             --> I Love The USA
//    DBHostCountry                           --> DB Host Country
//    SetSlot123ToInput456                    --> Set Slot 123 To Input 456
//    ILoveTheUSANetworkInTheUSA              --> I Love The USA Network In The USA
//    Limit_IOC_Duration                      --> Limit IOC Duration
//    This_is_a_Test_of_Network123_in_12_days --> This Is A Test Of Network 123 In 12 Days
//    ASongAboutTheABCsIsFunToSing                  --> A Song About The ABCs Is Fun To Sing
//    CFDs                                    --> CFDs
//    DBSettings                              --> DB Settings
//    IWouldLove1Apple                        --> 1 Would Love 1 Apple
//    Employee22IsCool                        --> Employee 22 Is Cool
//    SubIDIn                                 --> Sub ID In
//    ConfigureCFDsImmediately                --> Configure CFDs Immediately
//    UseTakerLoginForOnBehalfOfSubIDInOrders --> Use Taker Login For On Behalf Of Sub ID In Orders
//
function camelCaseToTitleCase(in_camelCaseString) {
        var result = in_camelCaseString                         // "ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D"
            .replace(/([a-z])([A-Z][a-z])/g, "$1 $2")           // "To Get YourGEDIn TimeASong About The26ABCs IsOf The Essence ButAPersonalIDCard For User456In Room26AContainingABC26Times IsNot AsEasy As123ForC3POOrR2D2Or2R2D"
            .replace(/([A-Z][a-z])([A-Z])/g, "$1 $2")           // "To Get YourGEDIn TimeASong About The26ABCs Is Of The Essence ButAPersonalIDCard For User456In Room26AContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
            .replace(/([a-z])([A-Z]+[a-z])/g, "$1 $2")          // "To Get Your GEDIn Time ASong About The26ABCs Is Of The Essence But APersonal IDCard For User456In Room26AContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
            .replace(/([A-Z]+)([A-Z][a-z][a-z])/g, "$1 $2")     // "To Get Your GEDIn Time A Song About The26ABCs Is Of The Essence But A Personal ID Card For User456In Room26A ContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
            .replace(/([a-z]+)([A-Z0-9]+)/g, "$1 $2")           // "To Get Your GEDIn Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC26Times Is Not As Easy As 123For C3POOr R2D2Or 2R2D"
            
            // Note: the next regex includes a special case to exclude plurals of acronyms, e.g. "ABCs"
            .replace(/([A-Z]+)([A-Z][a-rt-z][a-z]*)/g, "$1 $2") // "To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC26Times Is Not As Easy As 123For C3PO Or R2D2Or 2R2D"
            .replace(/([0-9])([A-Z][a-z]+)/g, "$1 $2")          // "To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC 26Times Is Not As Easy As 123For C3PO Or R2D2Or 2R2D"  

						// Note: the next two regexes use {2,} instead of + to add space on phrases like Room26A and 26ABCs but not on phrases like R2D2 and C3PO"
            .replace(/([A-Z]{2,})([0-9]{2,})/g, "$1 $2")        // "To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
            .replace(/([0-9]{2,})([A-Z]{2,})/g, "$1 $2")        // "To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
            .trim();


  // capitalize the first letter
  return result.charAt(0).toUpperCase() + result.slice(1);
}
Run Code Online (Sandbox Code Playgroud)

或者,正如Barno用户所建议的那样,如果您不介意拉入该库,使用SugarJS是一个简单的解决方案.我不确定它是否处理我上面描述的测试字符串; 我没有尝试过那个输入.


asa*_*afd 9

这是我的版本.它在每个UpperCase英文字母之前添加一个空格,该字母在小写英文字母后面,并且如果需要还可以将第一个字母大写:

例如:
thisIsCamelCase - >这是Camel Case
这个IsCamelCase - >这是Camel Case
thisIsCamelCase123 - >这是Camel Case123

  function camelCaseToTitleCase(camelCase){
    if (camelCase == null || camelCase == "") {
      return camelCase;
    }

    camelCase = camelCase.trim();
    var newText = "";
    for (var i = 0; i < camelCase.length; i++) {
      if (/[A-Z]/.test(camelCase[i])
          && i != 0
          && /[a-z]/.test(camelCase[i-1])) {
        newText += " ";
      }
      if (i == 0 && /[a-z]/.test(camelCase[i]))
      {
        newText += camelCase[i].toUpperCase();
      } else {
        newText += camelCase[i];
      }
    }

    return newText;
  }
Run Code Online (Sandbox Code Playgroud)


小智 8

好吧,我比赛晚了几年,但我有一个类似的问题,我想为每一个可能的输入制作一个替代解决方案.我必须给大部分的功劳要@ZenMaster该线程和@Benjamin Udink十大美食在这个线程.这是代码:

var camelEdges = /([A-Z](?=[A-Z][a-z])|[^A-Z](?=[A-Z])|[a-zA-Z](?=[^a-zA-Z]))/g;
var textArray = ["lowercase",
                 "Class",
                 "MyClass",
                 "HTML",
                 "PDFLoader",
                 "AString",
                 "SimpleXMLParser",
                 "GL11Version",
                 "99Bottles",
                 "May5",
                 "BFG9000"];
var text;
var resultArray = [];
for (var i = 0; i < a.length; i++){
    text = a[i];
    text = text.replace(camelEdges,'$1 ');
    text = text.charAt(0).toUpperCase() + text.slice(1);
    resultArray.push(text);
}
Run Code Online (Sandbox Code Playgroud)

它有三个子句,都使用先行来防止正则表达式引擎消耗太多字符:

  1. [A-Z](?=[A-Z][a-z])寻找大写字母,然后是大写字母,然后是小写字母.这是为了结束像美国这样的缩写词.
  2. [^A-Z](?=[A-Z])查找非大写字母后跟大写字母.这样结束了像myWord这样的单词和像99Bottles这样的符号.
  3. [a-zA-Z](?=[^a-zA-Z])找一封信后跟一个非字母.这样可以在像BFG9000这样的符号之前结束单词.

这个问题在我的搜索结果中排在最前面,所以希望我可以节省一些时间!


Dip*_*ipu 7

此实现考虑了连续的大写字母和数字。

function camelToTitleCase(str) {
  return str
    .replace(/[0-9]{2,}/g, match => ` ${match} `)
    .replace(/[^A-Z0-9][A-Z]/g, match => `${match[0]} ${match[1]}`)
    .replace(/[A-Z][A-Z][^A-Z0-9]/g, match => `${match[0]} ${match[1]}${match[2]}`)
    .replace(/[ ]{2,}/g, match => ' ')
    .replace(/\s./g, match => match.toUpperCase())
    .replace(/^./, match => match.toUpperCase())
    .trim();
}

// ----------------------------------------------------- //

var testSet = [
    'camelCase',
    'camelTOPCase',
    'aP2PConnection',
    'superSimpleExample',
    'aGoodIPAddress',
    'goodNumber90text',
    'bad132Number90text',
];

testSet.forEach(function(item) {
    console.log(item, '->', camelToTitleCase(item));
});
Run Code Online (Sandbox Code Playgroud)

预期输出:

camelCase -> Camel Case
camelTOPCase -> Camel TOP Case
aP2PConnection -> A P2P Connection
superSimpleExample -> Super Simple Example
aGoodIPAddress -> A Good IP Address
goodNumber90text -> Good Number 90 Text
bad132Number90text -> Bad 132 Number 90 Text
Run Code Online (Sandbox Code Playgroud)


小智 6

基于以上示例之一,我想到了这一点:

const camelToTitle = (camelCase) => camelCase
  .replace(/([A-Z])/g, (match) => ` ${match}`)
  .replace(/^./, (match) => match.toUpperCase())
  .trim()
Run Code Online (Sandbox Code Playgroud)

它对我有用.trim(),因为它用于处理首字母大写的小写情况,最终您会得到多余的前导空格。

参考:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/Trim


jfr*_*d00 5

您可以使用这样的函数:

function fixStr(str) {
    var out = str.replace(/^\s*/, "");  // strip leading spaces
    out = out.replace(/^[a-z]|[^\s][A-Z]/g, function(str, offset) {
        if (offset == 0) {
            return(str.toUpperCase());
        } else {
            return(str.substr(0,1) + " " + str.substr(1).toUpperCase());
        }
    });
    return(out);
}

"hello World" ==> "Hello World"
"HelloWorld" ==> "Hello World"
"FunInTheSun" ==? "Fun In The Sun"
Run Code Online (Sandbox Code Playgroud)

这里有一堆测试字符串的代码: http: //jsfiddle.net/jfriend00/FWLuV/

此处保留前导空格的替代版本: http: //jsfiddle.net/jfriend00/Uy2ac/


ita*_*chi 5

另一种基于正则表达式的解决方案。

respace(str) {
  const regex = /([A-Z])(?=[A-Z][a-z])|([a-z])(?=[A-Z])/g;
  return str.replace(regex, '$& ');
}
Run Code Online (Sandbox Code Playgroud)

解释

上面的正则表达式由两个相似的部分组成,并用OR运算符分隔。上半场:

  1. ([A-Z])- 匹配大写字母...
  2. (?=[A-Z][a-z])- 后跟一系列大写和小写字母。

当应用于序列FOo时,这有效地匹配其F字母。

还是第二种情况:

  1. ([a-z])- 匹配小写字母...
  2. (?=[A-Z])- 后跟一个大写字母。

当应用于序列barFoo时,这有效地匹配其r字母。

当找到所有替换候选者时,最后要做的就是用相同的字母但带有额外的空格字符来替换它们。为此,我们可以用作'$& '替换,它将解析为匹配的子字符串,后跟空格字符。

例子

const regex = /([A-Z])(?=[A-Z][a-z])|([a-z])(?=[A-Z])/g
const testWords = ['ACoolExample', 'fooBar', 'INAndOUT', 'QWERTY', 'fooBBar']

testWords.map(w => w.replace(regex, '$& '))
->(5) ["A Cool Example", "foo Bar", "IN And OUT", "QWERTY", "foo B Bar"]
Run Code Online (Sandbox Code Playgroud)


Pur*_*lex 5

如果您处理Capital Camel Case,此代码段可以为您提供帮助,它还包含一些规范,因此您可以确保它与您的案例相匹配。

export const fromCamelCaseToSentence = (word) =>
  word
    .replace(/([A-Z][a-z]+)/g, ' $1')
    .replace(/([A-Z]{2,})/g, ' $1')
    .replace(/\s{2,}/g, ' ')
    .trim();
Run Code Online (Sandbox Code Playgroud)

和规格:

describe('fromCamelCaseToSentence', () => {
 test('does not fall with a single word', () => {
   expect(fromCamelCaseToSentence('Approved')).toContain('Approved')
   expect(fromCamelCaseToSentence('MDA')).toContain('MDA')
 })

 test('does not fall with an empty string', () => {
   expect(fromCamelCaseToSentence('')).toContain('')
 })

 test('returns the separated by space words', () => {
   expect(fromCamelCaseToSentence('NotApprovedStatus')).toContain('Not Approved Status')
   expect(fromCamelCaseToSentence('GDBState')).toContain('GDB State')
   expect(fromCamelCaseToSentence('StatusDGG')).toContain('Status DGG')
 })
})
Run Code Online (Sandbox Code Playgroud)


Rok*_*jan 5

使用JS的String.prototype.replace()String.prototype.toUpperCase()

const str = "thisIsATestString";
const res = str.replace(/^[a-z]|[A-Z]/g, (c, i) => (i? " " : "") + c.toUpperCase());

console.log(res);  // "This Is A Test String"
Run Code Online (Sandbox Code Playgroud)


myt*_*thz 5

我的分案解决方案的行为符合我想要的方式:

const splitCase = s => !s || s.indexOf(' ') >= 0 ? s :
    (s.charAt(0).toUpperCase() + s.substring(1))
        .split(/(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/g)
        .map(x => x.replace(/([0-9]+)/g,'$1 '))
        .join(' ')
Run Code Online (Sandbox Code Playgroud)

输入

'a,abc,TheId,TheID,TheIDWord,TheID2Word,Leave me Alone!'
.split(',').map(splitCase)
.forEach(x => console.log(x))
Run Code Online (Sandbox Code Playgroud)

输出

A
Abc
The Id
The ID
The ID Word
The ID2 Word
Leave me Alone!
Run Code Online (Sandbox Code Playgroud)

由于上述函数需要JS 中的 Lookbehind,而 Safari 目前尚未实现,因此我重写了实现,以不使用下面的 RegEx:

const isUpper = c => c >= 'A' && c <= 'Z'
const isDigit = c => c >= '0' && c <= '9'
const upperOrDigit = c => isUpper(c) || isDigit(c)

function splitCase(s) {
    let to = []
    if (typeof s != 'string') return to
    let lastSplit = 0
    for (let i=0; i<s.length; i++) {
        let c = s[i]
        let prev = i>0 ? s[i-1] : null
        let next = i+1 < s.length ? s[i+1] : null
        if (upperOrDigit(c) && (!upperOrDigit(prev) || !upperOrDigit(next))) {
            to.push(s.substring(lastSplit, i))
            lastSplit = i
        }
    }
    to.push(s.substring(lastSplit, s.length))
    return to.filter(x => !!x)
}
Run Code Online (Sandbox Code Playgroud)