匹配所有短语并将元素推送到数组

时间:2018-01-23 20:24:30

标签: javascript jquery arrays regex

我正在尝试将所有键入的短语(字符)与主数组匹配。我有一个很大的数组,当用户键入我想要搜索我的数组并仅显示匹配条目的内容时,例如:如果用户输入拼图然后从我的数组中输入'我的拼图开始','输入你的拼图'这两者都应该匹配。

我在这里创建了 Fiddle ,这是我的HTML代码

Search: <input autocomplete="off" type="text" id="search" /><br />
Results: <input type="text" id="results_count" /><br />
<textarea id="results_text" style="width:300px; height:500px"></textarea>

我的js代码

var string =['1234sud','man in puzzle','rocking roll','1232 -powernap','all_broswers'];
$('#search').keyup(function() {
  var search = $(this).val();
  var resultsText = $('#results_text');
  var resultsCount = $('#results_count');
  if (!search) {
    resultsText.val('');
    resultsCount.val('0');
    return;
  }
  var j = 0, results = [],result;
  for   (var i=0;i<string.length;i++){
  var rx = new RegExp('"([*'+search+'*])"','gi');

  if (rx.exec(string[i])) {
    results.push(string[i]);
    j += 1;
    if (j >=100)
      break;
  }
  }

  //results=string;
  resultsText.val(results);
  console.log(results)
  resultsCount.val(j);
});

我无法编写与数组短语(字符)匹配的正则表达式,并将匹配元素推送到结果数组。任何帮助将提前感谢。

6 个答案:

答案 0 :(得分:1)

var string = ['1234sud', 'man in puzzle', 'rocking roll', '1232 -powernap', 'all_broswers'];
$('#search').keyup(function() {
  var search = $(this).val();
  var resultsText = $('#results_text');
  var resultsCount = $('#results_count');
  if (!search) {
    resultsText.val('');
    resultsCount.val('0');
    return;
  }
  var j = 0,
    results = [],
    result;
    
  for (var i = 0; i < string.length; i++) {
    if (string[i].indexOf(search) > -1) {
      results.push(string[i]);
      j += 1;
      if (j >= 100)
        break;
    }
  }

  //results=string;
  resultsText.val(results);
  console.log(results)
  resultsCount.val(j);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
Search: <input autocomplete="off" type="text" id="search" /><br /> Results: <input type="text" id="results_count" /><br />
<textarea id="results_text" style="width:300px; height:500px"></textarea>

使用String.prototype.indexOf()功能,这正是您想要完成的任务。

答案 1 :(得分:0)

规范化案例并使用enter image description here

{{1}}

答案 2 :(得分:0)

最简单的解决方案:不要使用正则表达式。

对于这个特殊问题,您最好只使用indexOf查找子字符串的索引。

const words = ['hello', 'jello', 'cake', 'pie'];
const term = 'ello';

const result = words.filter(word => word.indexOf(term) > -1);
console.log(result);

你没有指定,但是如果你只希望单词匹配(与我上面的部分单词匹配相反),你可以用空格填充它。

如果你坚持使用正则表达式,那么你需要的只是单词本身:

const words = ['hello', 'jello', 'cake', 'pie'];
const term = 'ello';

const result = words.filter(word => (new RegExp(term, 'gi')).test(word));
console.log(result);

您不需要任何花哨的符号或分组或任何东西。

/ello/的正则表达式意味着“在字符串中的任何位置找到此单词”。由于没有^$,因此不受开始或结束的限制,因此不需要通配符。

此外,使用test()代替exec(),因为test()解析为布尔值,对if语句更准确。

同样,如果你想要整个单词,你可以将它包装在空格中,其开头和结尾都有/[^\s]word[\s$]/,这意味着“无论是空格还是短语的开头”和“空格或者空格”短语的结尾“。

答案 3 :(得分:0)

如果您需要完全匹配,请使用String.match:

if (search.match(string[i])) {
  results.push(string[i]);
  j += 1;
}

或者为不完全匹配的情况动态创建正则表达式:

var rxs = '.*' + search + '.*';
var rx = new RegExp(rxs,'gi');

答案 4 :(得分:0)

也许您想为该任务使用过滤器()。

var words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.length > 6);
// const result = words.filter(word => word.indexOf(words.search) >= 0);
console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

希望这有帮助。

答案 5 :(得分:0)

const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
let checkWord = "elite"

words.forEach(x=>{
    checkWord.match(new RegExp(x)
})