Javascript 过滤非字母数字并生成滴定酶
我有一个列表,上面有一堆我需要转换成字母数字用户名的名字。我想做的是取名称,删除任何非字母数字值,并将其转换为删除字符的标题大小写。例如:Javascript 过滤非字母数字并生成滴定酶,javascript,regex,Javascript,Regex,我有一个列表,上面有一堆我需要转换成字母数字用户名的名字。我想做的是取名称,删除任何非字母数字值,并将其转换为删除字符的标题大小写。例如: johnson -> Johnson Van Halen -> VanHalen Torres-hernandez -> TorresHernandez Rafael van der vaart -> RafaelVanDerVaart 这可以用正则表达式来完成吗?使用一些字符串操作,可以非常简单地完成 var name =
johnson -> Johnson
Van Halen -> VanHalen
Torres-hernandez -> TorresHernandez
Rafael van der vaart -> RafaelVanDerVaart
这可以用正则表达式来完成吗?使用一些字符串操作,可以非常简单地完成
var name = "Torres-hernandez", i, part, out = "";
parts = name.split(/[^a-z0-9]+/gi);
for (i=0; part = parts[i++];) {
out += part[0].toUpperCase() + part.slice(1).toLowerCase();
}
使用一些字符串操作,您可以非常简单地完成这项工作
var name = "Torres-hernandez", i, part, out = "";
parts = name.split(/[^a-z0-9]+/gi);
for (i=0; part = parts[i++];) {
out += part[0].toUpperCase() + part.slice(1).toLowerCase();
}
您可以使用简单的regexp执行此操作:
var titleCase = function(s) {
return s.toLowerCase().replace(/(?:^|\W)+(\w|$)/g, function(match, tail) {
return tail.toUpperCase();
});
};
正则表达式/(?:^ |\W)+(\W |$)/g
这里捕获从上一个单词的开头到新单词的第一个字母的子字符串,新单词的第一个字母应该大写
它捕获整个匹配,并将其替换为大写的最后一个字符tail
如果您的字符串以错误字符(例如空格)结尾,那么它也会被捕获,但在这种情况下,taild
将是一个空字符串:
' toRReS $#@%^! heRnAndeZ -++--=-=' -> 'TorresHernandez'
让我们检查一下我的regexp:
-非字母数字字符的序列(^ |\W)+
,(…)+
或字符串的开头\W
,后面可以跟任意数量的非字母数字字符。它应该至少包含一个字符,除非它是字符串的开头,否则它可能是空的^
-同样的事情,但由于(?:^ |\W)+
,它不会被缓存。我们真的不在乎这部分,只是想剥掉它?:
-任何字母数字字符(\w |$)
或字符串的结尾\w
。此部分将被缓存并放入$
变量中tail
var titleCase = function(str) {
return str.split(/\W+/g)
.filter(function(s) {
return s.length > 0;
}).map(function(s) {
return s[0].toUpperCase() + s.slice(1).toLowerCase();
}).join('');
};
这个解决方案受到了他的启发,与他自己的非常相似。不同之处在于,我的版本对循环使用数组操作而不是,并使用filter
来处理开头或和处字符不正确的字符串
我在正则表达式中使用了\w
和\w
特殊文本,它们分别等于[A-Za-z0-9\
和[^A-Za-z0-9\
)。如果您不想将\uu
算作字母数字字符,则应将\w
和\w
替换为要匹配的精确字符集(例如[A-Za-z0-9]
和[^A-Za-z0-9]
)。您可以使用简单的regexp:
var titleCase = function(s) {
return s.toLowerCase().replace(/(?:^|\W)+(\w|$)/g, function(match, tail) {
return tail.toUpperCase();
});
};
正则表达式/(?:^ |\W)+(\W |$)/g
这里捕获从上一个单词的开头到新单词的第一个字母的子字符串,新单词的第一个字母应该大写
它捕获整个匹配,并将其替换为大写的最后一个字符tail
如果您的字符串以错误字符(例如空格)结尾,那么它也会被捕获,但在这种情况下,taild
将是一个空字符串:
' toRReS $#@%^! heRnAndeZ -++--=-=' -> 'TorresHernandez'
让我们检查一下我的regexp:
(^ |\W)+
-非字母数字字符的序列(…)+
,\W
或字符串的开头^
,后面可以跟任意数量的非字母数字字符。它应该至少包含一个字符,除非它是字符串的开头,否则它可能是空的
(?:^ |\W)+
-同样的事情,但由于?:
,它不会被缓存。我们真的不在乎这部分,只是想剥掉它
(\w |$)
-任何字母数字字符\w
或字符串的结尾$
。此部分将被缓存并放入tail
变量中
更新如果正则表达式让您感到困惑,您可以对字符串和数组操作执行相同的操作:
var titleCase = function(str) {
return str.split(/\W+/g)
.filter(function(s) {
return s.length > 0;
}).map(function(s) {
return s[0].toUpperCase() + s.slice(1).toLowerCase();
}).join('');
};
这个解决方案受到了他的启发,与他自己的非常相似。不同之处在于,我的版本对循环使用数组操作而不是,并使用filter
来处理开头或和处字符不正确的字符串
我在正则表达式中使用了\w
和\w
特殊文本,它们分别等于[A-Za-z0-9\
和[^A-Za-z0-9\
)。如果您不想将\uu
算作字母数字字符,则应将\w
和\w
替换为要匹配的精确字符集(例如[A-Za-z0-9]
和[^A-Za-z0-9]
)。您使用的正则表达式是什么?首先您尝试了什么?其次,知道你使用的是哪种口味/语言是非常重要的。我在浏览器(javascript)中使用它,希望您也注意到有些名称不符合此逻辑。举个例子,你使用哪个正则表达式?首先,你尝试过什么?其次,知道你使用的是哪种口味/语言是非常重要的。我在浏览器(javascript)中使用它,希望您也注意到有些名称不符合此逻辑。例如