正则表达式分裂骆驼案

kel*_*dar 37 javascript regex

我在JavaScript中有一个正则表达式,使用以下代码将我的驼峰大小写字母分割为大写字母(我后来从这里得到):

"MyCamelCaseString"
    .replace(/([A-Z])/g, ' $1')
    .replace(/^./, function(str){ return str.toUpperCase(); })
Run Code Online (Sandbox Code Playgroud)

因此返回:

"My Camel Case String"
Run Code Online (Sandbox Code Playgroud)

这很好.但是,我想把它提升一个档次.有人可以帮助我使用正则表达式,只有当前一个字符为小写且后者为大写时才会拆分.

因此,上面的例子将是我期望的结果,但如果我这样做:

"ExampleID"
Run Code Online (Sandbox Code Playgroud)

然后我回来了:

"Example ID"
Run Code Online (Sandbox Code Playgroud)

代替

"Example I D"
Run Code Online (Sandbox Code Playgroud)

因为它在每个大写字母中分裂并忽略它之前的任何内容.

希望有道理!谢谢:).

Mic*_*ral 70

我的猜测是代替/([A-Z])//([a-z])([A-Z])/' $1''$1 $2'

"MyCamelCaseString"
    .replace(/([a-z])([A-Z])/g, '$1 $2');
Run Code Online (Sandbox Code Playgroud)

/([a-z0-9])([A-Z])/ 对于计为小写字符的数字

console.log("MyCamelCaseStringID".replace(/([a-z0-9])([A-Z])/g, '$1 $2'))
Run Code Online (Sandbox Code Playgroud)

  • 更一般地说:`console.log('File1NotFoundTBA'.replace(/([^ AZ])([AZ])/ g,'$ 1 $ 2'));`. (6认同)
  • 应该注意的是,这些示例不是驼峰式大小写,驼峰式大小写的首字母小写。如果这预计会从真正的驼峰式字符串中生成更多标题,那么您仍然需要将第一个字母大写并多一行:`str[0].toUpperCase() + str.substring(1);` (5认同)
  • @keldar 这不适用于数字。`Test1Test2` 将保持不变。 (2认同)

Adr*_*zar 40

"MyCamelCaseString".replace(/([a-z](?=[A-Z]))/g, '$1 ')
Run Code Online (Sandbox Code Playgroud)

输出:

"My Camel Case String"
Run Code Online (Sandbox Code Playgroud)


bri*_*lov 20

如果你想要一个小写单词数组:

"myCamelCaseString".split(/(?=[A-Z])/).map(s => s.toLowerCase());
Run Code Online (Sandbox Code Playgroud)

如果你想要一串小写单词:

"myCamelCaseString".split(/(?=[A-Z])/).map(s => s.toLowerCase()).join(' ');
Run Code Online (Sandbox Code Playgroud)

如果你想分开单词但保留外壳:

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


Eug*_*ene 15

有时,camelCase 字符串包含缩写,例如:

PDFSplitAndMergeSamples
PDFExtractorSDKSamples
PDFRendererSDKSamples
BarcodeReaderSDKSamples
Run Code Online (Sandbox Code Playgroud)

在这种情况下,以下函数将起作用,它将字符串拆分为单独的字符串:

function SplitCamelCaseWithAbbreviations(s){
   return s.split(/([A-Z][a-z]+)/).filter(function(e){return e});
}
Run Code Online (Sandbox Code Playgroud)

例子:

PDFSplitAndMergeSamples
PDFExtractorSDKSamples
PDFRendererSDKSamples
BarcodeReaderSDKSamples
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最彻底的。过滤器是去除空字符串。您应该在小写字母上添加 [0-9] ,但这绝对是最终答案。其他人在字符串中间的缩写上失败。 (3认同)

Ric*_*pia 5

我发现这个问题的答案在所有情况下都不起作用,而且对于 unicode 字符串也根本不起作用,所以这里的答案可以完成所有操作,包括破折号和下划线符号分割。

\n

\r\n
\r\n
let samples = [\n  "ThereIsWay_too  MuchCGIInFilms These-days",\n  "UnicodeCanBeCAPITALISEDTooYouKnow",\n  "CAPITALLetters at the StartOfAString_work_too",\n  "As_they_DoAtTheEND",\n  "BitteWerfenSie-dieFu\xc3\x9fballeInDenM\xc3\xbcll",\n  "IchHabeUberGesagtNicht\xc3\x9cber",\n  "2BeOrNot2Be",\n  "ICannotBelieveThe100GotRenewed. It-isSOOOOOOBad"\n];\n\nsamples.forEach(sample => console.log(sample.replace(/([^[\\p{L}\\d]+|(?<=[\\p{Ll}\\d])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{Ll}\\d])|(?<=[\\p{L}\\d])(?=\\p{Lu}[\\p{Ll}\\d]))/gu, \'-\').toUpperCase()));
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

如果您不希望将数字视为小写字母,则:

\n

\r\n
\r\n
let samples = [\n  "2beOrNot2Be",\n  "ICannotBelieveThe100GotRenewed. It-isSOOOOOOBad"\n];\n\nsamples.forEach(sample => console.log(sample.replace(/([^\\p{L}\\d]+|(?<=\\p{L})(?=\\d)|(?<=\\d)(?=\\p{L})|(?<=[\\p{Ll}\\d])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}\\p{Ll})|(?<=[\\p{L}\\d])(?=\\p{Lu}\\p{Ll}))/gu, \'-\').toUpperCase()));
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n


Keg*_*kle 5

如果您想大写并在数字之间添加空格,这是可行的。

transform(value: string, ...args: any[]): string {
    const str = 'this1IsASampleText';
    str.charAt(0).toUpperCase() + value.slice(1); // Capitalize the first letter
    str.replace(/([0-9A-Z])/g, ' $&'); // Add space between camel casing
}
Run Code Online (Sandbox Code Playgroud)

结果:

This 1 Is A Sample Text    
Run Code Online (Sandbox Code Playgroud)