Почему мой RegExp игнорирует начало и конец строк? - PullRequest
0 голосов
/ 29 июля 2011

Я сделал эту вспомогательную функцию для поиска отдельных слов, которые не являются частью больших выражений
она отлично работает для любого слова, которое НЕ является первым или последним в предложении, почему это так?
есть ли способдобавить "" к регулярному выражению?

String.prototype.findWord = function(word) {

    var startsWith = /[\[\]\.,-\/#!$%\^&\*;:{}=\-_~()\s]/ ;
    var endsWith = /[^A-Za-z0-9]/ ;

    var wordIndex = this.indexOf(word);

    if (startsWith.test(this.charAt(wordIndex - 1)) &&
        endsWith.test(this.charAt(wordIndex + word.length))) {

        return wordIndex;
    }
    else {return -1;}
}

Также приветствуются любые предложения по улучшению самой функции!

ОБНОВЛЕНИЕ: пример: я хочу найти слово able встрока, я хочу, чтобы она работала в таких случаях, как [able] able, #able1 и т. д., но не в тех случаях, когда она является частью другого слова, например disable, enable и т. д.

Ответы [ 3 ]

2 голосов
/ 29 июля 2011

Другая версия:

String.prototype.findWord = function(word) {
   return this.search(new RegExp("\\b"+word+"\\b"));
}

Ваш if будет оцениваться как true, только если endsWith соответствует после слова. Но последнее слово предложения оканчивается точкой с запятой, которая не будет соответствовать вашему буквенно-цифровому выражению.

1 голос
/ 29 июля 2011

Если вы хотите, чтобы ваше 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;
}
1 голос
/ 29 июля 2011

Вы пробовали границы слова - \b?

Существует также \w, который соответствует одному слову ([a-zA-Z_]) - это также может помочь вам (зависит от вашего определения word ).

Подробнее см. RegExp docs .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...