目前,我有以下几点:需要一个特定的JavaScript正则表达式匹配
var sText = 'I like stackoverflow';
if ($(this).text().match(eval("/" + sText + "/ig"))) {
正如你可以看到,这整个字符串匹配。
我需要匹配不区分大小写的文本,其中包含单独的所有单词。所以它会查找“I”,“like”和“stackoverflow”。它必须有3个单词。
非常感谢帮助。
目前,我有以下几点:需要一个特定的JavaScript正则表达式匹配
var sText = 'I like stackoverflow';
if ($(this).text().match(eval("/" + sText + "/ig"))) {
正如你可以看到,这整个字符串匹配。
我需要匹配不区分大小写的文本,其中包含单独的所有单词。所以它会查找“I”,“like”和“stackoverflow”。它必须有3个单词。
非常感谢帮助。
如果你真的需要用比赛来做到这一点,您可以使用多个正预测先行模式。例如,为了匹配a
,b
和c
,以任何顺序:
> p = /(?=.*a)(?=.*b)(?=.*c)/i
> 'abc'.match(p)
[""]
> 'cba'.match(p)
[""]
> 'ac'.match(p)
null
所有我需要的是正则表达式,但感谢 - 你的规则。修正了:eval(“/(?=.*”+ aText.join(')(?=。*')+“)/ ig”)) – HGPB
我有兴趣看到这个基准测试的'sText'相当大的值,特别是与将其分割成单个正则表达式相比较。我不能被打扰!这匹配''就像Stackoverflow“'顺便说一句,因为它缺乏单词边界,''像'包含'我' –
为什么使用正则表达式时.indexOf
将完成这项工作?
var str = $(this).text().toLowerCase();
if (str.indexOf('i')>=0 && str.indexOf('like')>=0 && str.indexOf('stackoverflow')>=0) {
// ...
}
(请注意,在这种情况下,“我”的搜索被浪费了,因为它包含在“喜欢”,但我相信你的实际代码正在寻找更多的普通的文本。)
文本可能长500字(+/-) – HGPB
@Haraldo:更多的理由避免正则表达式。 (或者那个评论意味着另一个答案?) – Blazemonger
不,我正在看你的条件。 – HGPB
你可以只拆分然后循环 -
var sText = 'I like stackoverflow';
var cText = 'stackoverflow like I';
var arr = sText.split(' ');
var match = true;
for (i=0;i<arr.length;i++) {
if (!cText.match(eval("/" + arr[i] + "/ig"))) match= false;
}
alert(match);
你需要保持效率一点,如果你是比较虽然很多字。
我认为这是你正在寻找的 - 关键是字的边界。
var text = "text to match"
var stringToLookFor = "I like stackoverflow";
var words = stringToLookFor.split(" ");
var match=true;
$.each(words, function(index, word) {
if(!text.match(eval("/\\b" + word + "\\b/i"))) {
match=false;
return false;
}
});
我添加了'return false',如果一个单词不匹配,将会终止循环,从而提高性能。 –
@PaulCreasey谢谢,我也更新了JSFiddle示例。 –
感谢您的时间 - 我似乎用Piet Delport的解决方案来解决它。 – HGPB
所以,你希望它同时匹配'“我喜欢计算器”'和尤达形式,'“计算器我喜欢”'也字符串像''我不喜欢stackoverflow“'?问题不清楚 –
是和“我sTackOverflow喜欢”! – HGPB
而不是eval,你可以使用RegExp对象,它有两个参数。首先是一个字符串(基本上是正则表达式,但没有尾部斜线),第二个是一串标志(在你的情况下是'ig')。但是,如果我正确地理解了你,'var sText =“(i | like | stackoverflow)”;'应该这样做吗?如果它是正确的,我会添加回答,如果不是,请更具体。 – zatatatata