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而不是字符串吗?