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
将结果数组拆分为小写,然后您可以通过下划线连接:
\B(?=[A-Z])
Run Code Online (Sandbox Code Playgroud)
假设字符串是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)
让我们再试一次斯坦...这应该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)