Javascript 为什么我的RegExp忽略字符串的开始和结束?

Javascript 为什么我的RegExp忽略字符串的开始和结束?,javascript,regex,string,Javascript,Regex,String,我使用此帮助函数查找单个单词,这些单词不是较大表达式的一部分 它适用于句子中不是第一个或最后一个的单词,为什么会这样? 有没有办法将“添加到regexp String.prototype.findWord = function(word) { var startsWith = /[\[\]\.,-\/#!$%\^&\*;:{}=\-_~()\s]/ ; var endsWith = /[^A-Za-z0-9]/ ; var wordIndex = this.i

我使用此帮助函数查找单个单词,这些单词不是较大表达式的一部分
它适用于句子中不是第一个或最后一个的单词,为什么会这样?
有没有办法将
添加到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
等情况下都能工作。。但是,如果它是另一个单词的一部分,例如
禁用、启用等

您是否尝试过单词边界--
\b

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

有关详细信息,请参阅。

是否尝试了word boundary--
\b

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

有关更多详细信息,请参阅。

其他版本:

String.prototype.findWord = function(word) {
   return this.search(new RegExp("\\b"+word+"\\b"));
}
您的
if
仅当
endsWith
在单词后面匹配时才会计算为true。但句子的最后一个单词以句号结尾,与您的字母数字表达式不匹配。

另一个版本:

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

您的
if
仅当
endsWith
在单词后面匹配时才会计算为true。但是句子的最后一个单词以句号结尾,这与字母数字表达式不匹配。

如果您想让带有
regexp的
结尾也与空字符串匹配,只需将
^$
附加到它:

var endsWith = /[^A-Za-z0-9]|^$/ ;
无论如何,您可以很容易地用
if(wordIndex==0)
检查它是否是文本的开头,用
if(wordIndex+word.length==this.length)
检查它是否是文本的结尾

也可以通过对输入字符串的副本进行操作来消除此问题,该副本由非字母数字字符包围。例如:

var s = "#" + this + "#"; 
var wordIndex = this.indexOf(word) - 1;
但恐怕你的功能还有另一个问题: 它永远不会与“disable-able-enable”这样的字符串中的“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;
}

如果希望您的
endsWith
regexp也与空字符串匹配,只需将
|^$
附加到它:

var endsWith = /[^A-Za-z0-9]|^$/ ;
无论如何,您可以很容易地用
if(wordIndex==0)
检查它是否是文本的开头,用
if(wordIndex+word.length==this.length)
检查它是否是文本的结尾

也可以通过对输入字符串的副本进行操作来消除此问题,该副本由非字母数字字符包围。例如:

var s = "#" + this + "#"; 
var wordIndex = this.indexOf(word) - 1;
但恐怕你的功能还有另一个问题: 它永远不会与“disable-able-enable”这样的字符串中的“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;
}

我需要找到搜索词之前的内容,如果有人搜索
able
,我需要看到它不是以字母开头的,并且可以
禁用
\w
也匹配数字:
[a-Za-z0-9.]
。我需要找到搜索词之前的内容,如果有人搜索
able
,我需要看到它不是以字母开头的,可以
disable
\w
也匹配数字:
[a-Za-z0-9.]
。你的问题让人困惑,你能给我们一个输入句子和所需输出的示例吗?我不知道“大表达式的一部分”是什么意思。@Andy Ray我更新了问题你的问题令人困惑,你能给我们一个输入句子和所需输出的示例吗?我不知道“大表达式的一部分”是什么意思。@Andy Ray我更新了questionthanx,那么我如何将它们添加到regexp中?@IlyaD,我建议你使用我的方法:)它工作得很好,但我不完全理解它,查找
\b
,它显示“单词边界”,所以它自动实现了我的目标…..)@伊利亚德,是的。很好,不是吗?:)非常好:)第一个
`before
\b`意思是说
\b
是regexp而不是字符串吗?thanx,那么我该如何将它们添加到regexp中呢?@IlyaD,我建议你使用我的方法:)它工作得很好,但我不完全理解它,查找
\b
,它说“单词边界”,所以它自动实现了我的目标……?:)@伊利亚德,是的。很好,不是吗?:)非常好:)前面的第一个
`before
\b`意思是说
\b
是regexp而不是字符串吗?