为什么我的RegExp忽略了字符串的开头和结尾?

时间:2011-07-29 09:47:30

标签: javascript regex string

我使用这个辅助函数来查找单个单词,这些单词不是更大表达式的一部分 它适用于任何不是句子中的第一个或最后一个的单词,为什么会这样? 有没有办法将""添加到regexp?

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 个答案:

答案 0 :(得分:2)

另一个版本:

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

if仅在endsWith匹配后才会评为真。但是句子的最后一个单词以句号结尾,这与你的字母数字表达式不符。

答案 1 :(得分:1)

您是否尝试字边界 - \b

还有\w匹配一个单词字符([a-zA-Z_]) - 这也可以帮助您(取决于您的单词定义)。

有关详细信息,请参阅RegExp docs

答案 2 :(得分:1)

如果您希望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;
}