我想从字符串中提取所有单词并将它们放在数组中。
我所说的"单词"是指一系列连续的字母。如果我有空格或其他字符,单词将在那里结束。
例如,如果我有这个字符串:
"my name is sil/ves tru, what?is."
我想要一个这样的数组:
arr[0] = "my";
arr[1] = "name";
arr[2] = "is";
arr[3] = "sil";
arr[4] = "ves";
arr[5] = "tru";
arr[6] = "what";
arr[7] = "is";
这是我目前拥有的:
var str = "my name is sil/ves tru, what?is."; //my string
var i;
var arr = [];
for (i = 0; i < str.length; i++) { //check all positions
if ((str[i] >= "a") && (str[i] <= "z")) { //check where string don't have letter and put the word in arr
//help me here
}
}
console.log(arr); //my array with words
您可以使用正则表达式拆分任何连续的非字母序列。
var str = "my name is sil/ves tru, what?is.";
var arr = str.split(/[^a-z]+/i).filter(Boolean); // or .filter(s=>s)
console.log(arr);
正则表达式/[^a-z]+/gi
删除不需要的字符,然后拆分。
var str = "my name is sil/ves tru, what?is.".replace(/[^a-z]+/gi, " ").trim().split(" ");
console.log(str);
.as-console-wrapper { max-height: 100% !important; top: 0; }
这样就可以了。使用正则表达式,您可以按字母以外的所有内容进行拆分,如果使用filter(Boolean)
,如果句子不以字母结尾,则可以删除数组中的最后一个空项。
let string = "my name is sil/ves tru, what?is.";
let array = string.split(/[^A-Za-z]+/).filter(Boolean);
console.log(array)
你只需要与String.replace()
、 String.trim()
和String.split()
结合使用的正则表达式:
var str = "my name is sil/ves tru, what?is.";
var ary = str.replace(/[^a-zA-Z ]/g, " ").trim().split(/s+/);
console.log(ary);
/*
^ not
a-zA-z a through z or A through Z
g global find/replace
.trim() remove leading/trailing space from string
.split(/s+/) split the string where there is one or more spaces and return an array
*/
谢谢大家!!
这是我解决这个问题的方法:
var str = "what am/i doing. . j here 9what";
var i;
var j = 0;
var arr = [];
var temp = "";
for (i = 0; i < str.length; i++) {
if ((str[i] >= "a") && (str[i] <= "z")) {
temp = temp + str[i];
}
else {
if (temp == "") {
continue;
}
else {
arr[j] = temp;
temp = "";
j++;
}
}
if ((i == str.length - 1) && ((str[i] >= "a") && (str[i] <= "z"))) {
arr[j] = temp;
}
}
console.log(str.length);
console.log(arr);
当然,最优雅/最短的解决方案是使用正则表达式。
根据您的答案,重构if
,使用标准else if
样式并使用推荐的严格比较运算符===
& !==
,更好的"循环"解决方案将是:
var str = "what am/i doing. . j here 9what";
var i;
var j = 0;
var arr = [];
var temp = "";
for (i = 0; i < str.length; i++) {
if ((str[i] >= "a") && (str[i] <= "z")) {
temp = temp + str[i];
if (i === str.length - 1) { arr[j] = temp; }
} else if (temp !== "") {
arr[j] = temp;
temp = "";
j++;
}
}
console.log(str.length);
console.log(arr);
请注意,仅当最后一个字符是字母时,才需要检查输入字符串的末尾(如果已到达最后一个单词,则向数组中添加最后一个单词(。如果最后一个字符不是字母,则最后一个单词已添加到数组中,并且temp
为空。
使用较短的赋值运算符+=
、允许大写字母的字符串toLowerCase()
方法和数组push()
方法(从而消除第二个索引变量j
(的更好的循环解决方案是:
var str = "What am/I doing. . J here 9what";
var i;
var arr = [];
var temp = "";
for (i = 0; i < str.length; i++) {
if ((str[i].toLowerCase() >= "a") && (str[i].toLowerCase() <= "z")) {
temp += str[i];
if (i === str.length - 1) { arr.push(temp); }
} else if (temp !== "") {
arr.push(temp);
temp = "";
}
}
console.log(str.length);
console.log(arr);