这已经得到了回答和接受,但我想我会提供一种稍微过度设计的方法,可以更好地匹配复数形式。除此之外,它使用与@ExplosionPills 解决方案完全相同的逻辑:
(function() {
var isWord = function(word) { return /^[a-z]+$/i.test(word); },
exceptions = {
man: 'men',
woman: 'women',
child: 'children',
mouse: 'mice',
tooth: 'teeth',
goose: 'geese',
foot: 'feet',
ox: 'oxen'
},
pluralise = function(word) {
word = word.toLowerCase();
if (word in exceptions) {
// Exceptions
return '(?:' + word + '|' + exceptions[word] + ')';
} else if (word.match(/(?:x|s|[cs]h)$/)) {
// Sibilants
return word + '(?:es)?';
} else if (word.match(/[^f]f$/)) {
// Non-Geminate Labio-Dental Fricative (-f > -ves / -fs)
return '(?:' + word + 's?|' + word.replace(/f$/, 'ves') + ')';
} else if (word.match(/[^aeiou]y$/)) {
// Close-Front Unround Pure Vowel (-Cy > -Cies)
return '(?:' + word + '|' + word.replace(/y$/, 'ies') + ')';
} else if (word.substr(-1) == 'o') {
// Mid-Back Round Vowel (-o > -oes / -os)
return word + '(?:e?s)?';
} else {
// Otherwise
return word + 's?';
}
};
String.prototype.containsNoun = function(singularNoun) {
if (!isWord(singularNoun)) throw new TypeError('Invalid word');
var check = new RegExp('\\b' + pluralise(singularNoun) + '\\b', 'gi');
return check.test(this);
};
String.prototype.pluralException = function(plural) {
if (!isWord(this) || !isWord(plural)) throw new TypeError('Invalid exception');
var singular = this.toLowerCase();
plural = plural.toLowerCase();
if (!(singular in exceptions)) {
exceptions[singular] = plural;
}
};
})();
它扩展了本机String
对象,因此您可以像这样使用它:
'Are there some foos in here?'.containsNoun('foo'); // True
有关在 Node.js 中完成的一些快速而简单的单元测试,请参阅要点。