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

时间:2018-10-24 08:08:17

标签: 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;
}

3 个答案:

答案 0 :(得分:4)

您需要能够检测到大写字母在字符串中紧接另一个字母(即不跟空格)的点。您可以使用正则表达式,在输入字符串上调用toLowerCase之前

\B(?=[A-Z])

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

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

console.log(snakeCase('snakeCase'));

答案 1 :(得分:1)

假设字符串为Hello World?,并且您希望返回的值为hello_world?(带有字符,然后遵循以下代码)

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

示例

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

snakeCase('Hello & World')
// "hello_&_world"

答案 2 :(得分:0)

我认为这应该涵盖所有基础?

它的灵感来自@ h0r53对已接受答案的回答。但是,它演变为更完整的功能,因为它将按您期望的方式将 any 字符串camelCasekebab-case或其他方式转换为snake_case,仅包含a-z0-9字符,可用于函数名和变量名:

convert_to_snake_case(string) {
    return string.charAt(0).toLowerCase() + string.slice(1) // lowercase the first character
      .replace(/\W+/g, " ") // Remove all excess white space and replace & , . etc.
      .replace(/([a-z])([A-Z])([a-z])/g, "$1 $2$3") // Put a space at the position of a camelCase -> camel Case
      .split(/\B(?=[A-Z]{2,})/) // Now split the multi-uppercases customerID -> customer,ID
      .join(' ') // And join back with spaces.
      .split(' ') // Split all the spaces again, this time we're fully converted
      .join('_') // And finally snake_case things up
      .toLowerCase() // With a nice lower case
  }

转换示例:

'snakeCase'                  => 'snake_case'
'CustomerID'                 => 'customer_id'
'GPS'                        => 'gps'
'IP-address'                 => 'ip_address'
'Another & Another, one too' => 'another_another_one_too'
'random ----- Thing123'      => 'random_thing123'
'kebab-case-example'         => 'kebab_case_example'