检查一个字符串是否以数组中的任意字符串开头

9
在JavaScript中,我如何检查一个字符串是否以数组中的任何字符串开头?
例如,我有一个字符串数组:
const substrs = ['the', 'an', 'I'];

我有一个字符串

const str = 'the car';

如何检查一个字符串是否以 substrs 中的任何一个字符串开头?


2
你可以研究如何对一个字符串值进行操作,然后将循环包装在它周围... - CBroe
2
“the”和“there was a car”这样的词汇呢?它们应该匹配还是不匹配? - Thomas
使用 ['the', 'an', 'I'].toLocaleString() 可以获取 the,an,I,你有两个字符串可以操作。 - Alireza Ahmadi
4个回答

25
您可以结合使用ES6特性中的 Array.prototype.someString.prototype.startsWith 方法,以实现功能。

const substrs = ['the', 'an', 'I'];
function checkIfStringStartsWith(str, substrs) {
  return substrs.some(substr => str.startsWith(substr));
}

console.log(checkIfStringStartsWith('the car', substrs)); // true
console.log(checkIfStringStartsWith('a car', substrs)); // false
console.log(checkIfStringStartsWith('i am a car', substrs));  // false
console.log(checkIfStringStartsWith('I am a car', substrs));  // true

如果你希望比较的时候不区分大小写,那么你需要将字符串转换为小写:

const substrs = ['the', 'an', 'I'];
function checkIfStringStartsWith(str, substrs) {
  return substrs.some(substr => str.toLowerCase().startsWith(substr.toLowerCase()));
}

console.log(checkIfStringStartsWith('the car', substrs)); // true
console.log(checkIfStringStartsWith('a car', substrs)); // false
console.log(checkIfStringStartsWith('i am a car', substrs));  // true (case-insensitive)
console.log(checkIfStringStartsWith('I am a car', substrs));  // true


0
const check = (arr, str) => {
    const firstWord = str.substr(0, str.indexOf(" "));
    return arr.includes(firstWord);
}

const substrs = ['thee', 'an', 'I', 'The', 'the'];
const str = 'the car';

console.log(check(substrs, str)); //true

0

其中一种方法是构建一个正则表达式交替匹配 substrs 数组中的关键词。然后,使用 test() 函数对输入进行匹配检查:

const substrs = ['the', 'an', 'I'];
const str = 'the car';
regexp = new RegExp('^(?:' + substrs.join('|') + ')\\b');
console.log(regexp);
if (regexp.test(str)) {
    console.log("MATCH");
}

在这里,我还打印出了正在使用的正则表达式,以便清楚明了。


2
这种方法需要小心。只有在数组中的字符串不包含正则表达式中具有特殊含义的字符时才有效,最有可能的是“.”、“+”和“*”。然后您需要开始考虑转义问题,这将使解决方案变得更加复杂。 - Thomas
@Thomas 在JS中转义正则表达式非常容易,请参见此处,事实上Node已经内置了这个功能。你过度设计了这个问题,因为我们没有强烈的理由相信关键字除了单词字符以外还有其他内容。 - Tim Biegeleisen
2
你这个不需要使用正则表达式。 - Stefan Falk

0

const substrs = ['the', 'an', 'I'];
const str = 'the car';

let result = substrs.filter(s => str.startsWith(s));

console.log(result);


1
@jfriend00 不是的,请仔细阅读我的代码。str.startsWith(s) 这里的 str 是什么,s 是什么? - Vivek Bani
OP正在寻找以“I”、“the”、“an”开头的句子。在您的情况下,“and”、“Interest”和“them”也被视为符合条件的单词。 - Akshay G
哎呀,这是一种非常令人困惑的写法。 - jfriend00
@AkshayGaonkar 先仔细阅读问题。 - Vivek Bani
1
你可能会惊讶于你认为我有多愚蠢,或者你可以意识到,使用方法的代码可能会以不寻常的方式使人困惑。当OP只想要一个布尔值时,创建整个输出数组似乎是浪费的。我没有给你点踩,我只是第一次看到这段代码时感到困惑,并在评论中分享了我的看法,我认为这是对答案的相关评论。此外,告诉别人重新阅读某些内容,而不是用言语解释你的答案如何工作,不是澄清你的答案、消除困惑或赢得投票的最佳方式。 - jfriend00
2
发布没有解释的代码很少有帮助。 - Felix Kling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接