Если вы хотите, чтобы ваше endsWith
регулярное выражение также совпадало с пустой строкой, вам просто нужно добавить к нему |^$
:
var endsWith = /[^A-Za-z0-9]|^$/ ;
В любом случае, вы можете легко проверить, является ли это началомтекст с if (wordIndex == 0)
и, если это конец с if (wordIndex + word.length == this.length)
.
Эту проблему также можно устранить, работая с копией входной строки, окруженной не буквенно-цифровыми символами.Например:
var s = "#" + this + "#";
var wordIndex = this.indexOf(word) - 1;
Но я боюсь, что есть еще одна проблема с вашей функцией: она никогда не будет совпадать с "able" в строке типа "отключить возможность включения", так как вызов indexOf
вернется3, тогда startsWith.test(wordIndex)
вернет false
, и функция закроется с -1 без дальнейшего поиска.
Таким образом, вы можете попробовать:
String.prototype.findWord = function (word) {
var startsWith = "[\\[\\]\\.,-\\/#!$%\\^&\*;:{}=\\-_~()\\s]";
var endsWith = "[^A-Za-z0-9]";
var wordIndex = ("#"+this+"#").search(new RegExp(startsWith + word + endsWith)) - 1;
if (wordIndex == -1) { return -1; }
return wordIndex;
}