在Javascript中将不同的字符串转换为snake_case

dra*_*agi 3 javascript regex function

我知道我们有一个与此类似但不完全相同的问题。我试图让我的函数工作,它接受一个字符串作为参数并将其转换为 snake_case 。它大部分时间都适用于所有花哨的!?<>=字符,但有一种情况无法转换,并且它的 camelCase 。

当我传递像snakeCase. 它返回snakecase而不是snake_case.

我试图实现它,但我最终只是把它搞砸了。

请问我有什么帮助吗?

我的代码:

const snakeCase = string => {
    string = string.replace(/\W+/g, " ").toLowerCase().split(' ').join('_');

    if (string.charAt(string.length - 1) === '_') {
        return string.substring(0, string.length - 1);
    }

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

Cer*_*nce 12

您需要能够检测大写字母在另一个字母之后的字符串中的位置(即不跟在空格之后)。调用toLowerCase输入字符串之前,您可以使用正则表达式执行此操作:

\B(?=[A-Z])
Run Code Online (Sandbox Code Playgroud)

换句话说,一个非单词边界,后跟一个大写字符。在上面或文字空间上拆分,然后 .map将结果数组拆分为小写,然后您可以通过下划线连接:


Sub*_*dal 5

假设字符串是Hello World?,你想要返回的值为hello_world?(带有字符,然后按照下面的代码)

const snakeCase = (string) => {
  return string.replace(/\d+/g, ' ')
    .split(/ |\B(?=[A-Z])/)
    .map((word) => word.toLowerCase())
    .join('_');
};
Run Code Online (Sandbox Code Playgroud)

例子

snakeCase('Hello World?')
// "hello_world?"

snakeCase('Hello & World')
// "hello_&_world"
Run Code Online (Sandbox Code Playgroud)


Orw*_*ile 5

让我们再试一次斯坦...这应该CamelCASECapitals在意识到=的同时执行snake_case camel_case_capitals。这基本上是带有预过滤器的公认答案。

let splitCaps = string => string
    .replace(/([a-z])([A-Z]+)/g, (m, s1, s2) => s1 + ' ' + s2)
    .replace(/([A-Z])([A-Z]+)([^a-zA-Z0-9]*)$/, (m, s1, s2, s3) => s1 + s2.toLowerCase() + s3)
    .replace(/([A-Z]+)([A-Z][a-z])/g, 
        (m, s1, s2) => s1.toLowerCase() + ' ' + s2);
let snakeCase = string =>
    splitCaps(string)
        .replace(/\W+/g, " ")
        .split(/ |\B(?=[A-Z])/)
        .map(word => word.toLowerCase())
        .join('_');
Run Code Online (Sandbox Code Playgroud)
let splitCaps = string => string
    .replace(/([a-z])([A-Z]+)/g, (m, s1, s2) => s1 + ' ' + s2)
    .replace(/([A-Z])([A-Z]+)([^a-zA-Z0-9]*)$/, (m, s1, s2, s3) => s1 + s2.toLowerCase() + s3)
    .replace(/([A-Z]+)([A-Z][a-z])/g, 
        (m, s1, s2) => s1.toLowerCase() + ' ' + s2);
let snakeCase = string =>
    splitCaps(string)
        .replace(/\W+/g, " ")
        .split(/ |\B(?=[A-Z])/)
        .map(word => word.toLowerCase())
        .join('_');
Run Code Online (Sandbox Code Playgroud)