Javascript поиск по регулярному выражению в ArrayList для определенных c слов и печать слов до / после - PullRequest
0 голосов
/ 13 июля 2020

извините, если на этот вопрос уже дан ответ, но я не нашел ничего подходящего для моего случая.

В настоящее время я пытаюсь создать функцию предложения поиска с помощью Azure Cognitive Search. Это работает нормально. Но сейчас я пытаюсь построить что-то вроде этого:

предложение поиска

В предложении должен отображаться соответствующий шаблон, который вводится в строку поиска с парой слов до и после. Также показано на картинке.

Я попытался построить массив, который разбивает весь контент на отдельные слова и ищет шаблон. Но мне это кажется очень уродливым, потому что я не знаю, как перевернуть массив и получить слова до и после. И скомпилируйте это в подходящую строку.

          $.ajax({
            url: "https://" + azSearchInstance + ".search.windows.net/indexes/" + azSearchIndex + "/docs?api-version=" + azApiVersion + "&search=" + text + '&$top=' + azSearchResults + '&api-key=' + azApiKey,
            method: 'GET'
          }).done(function (data) {
            // display results
            currentSuggestion2 = data[0];
            add(data);
            for(let i in data.value) {
              var content = data.value[i].content;
              var contentArray = content.split(' ');

              for(let word in contentArray) {
                if(contentArray[word] === text) {
                  console.log(contentArray[word]);
                }
              }
            }
            var render = Mustache.render(template, data);
            $(".search-suggest").html(render)
          });

Моя вторая попытка заключалась в использовании функции indexOf (), но это приводит к той же проблеме, потому что она возвращает только число, в котором находится соответствующий шаблон.

          $.ajax({
            url: "https://" + azSearchInstance + ".search.windows.net/indexes/" + azSearchIndex + "/docs?api-version=" + azApiVersion + "&search=" + text + '&$top=' + azSearchResults + '&api-key=' + azApiKey,
            method: 'GET'
          }).done(function (data) {
            // display results
            currentSuggestion2 = data[0];
            add(data);
            for(let i in data.value) {
              var content = data.value[i].content;

              console.log(content.indexOf(text));
            }
            var render = Mustache.render(template, data);
            $(".search-suggest").html(render)
          });

Я ищу регулярное выражение, которое ищет шаблон и печатает как 4-5 слов до и после шаблона. У кого-нибудь из вас есть идея?

Заранее благодарю

С уважением

ОджунбамО

1 Ответ

0 голосов
/ 23 июля 2020

/(([a-z]+[^a-z]+)|([^a-z]+[a-z]+)){0,4}test(([a-z]+[^a-z]+)|([^a-z]+[a-z]+)){0,4}/i

Первый {0,4} означает до 4 слов перед поисковым запросом ('test'). Второй означает до 4 слов после поискового запроса.

Это могло быть написано {4} (точно 4), но тогда это не сработает, если поисковым запросом является первое слово. Поскольку перед ним будет 0 слов.

Большая часть сложности связана с тем, что ваш тестовый пример должен соответствовать test внутри {{testHelper}} вместе с предыдущими и последующими словами.

const searchTerm = 'test';
const strings = [
  'Hello World! And so, whenever you test-drive a new theme, make sure that you are buckled in.',
  'It is going to be a bumpy ride. In the below example there is a {{testHelper}} defined as an illustration.  This is for illustrative purposes.',
  'Some users have encountered the issue of duplicating the URL as TestName.github.io/Test for illegitamate uses.',
  'You do not have to, but if you want, you can click the Test connection button to make sure everything works as intended.',
];
const regExpString = String.raw`(([a-z]+[^a-z]+)|([^a-z]+[a-z]+)){0,4}${searchTerm}(([a-z]+[^a-z]+)|([^a-z]+[a-z]+)){0,4}`;
const regExp = new RegExp(regExpString, 'i');

strings.forEach(string => {
  const match = string.match(regExp)?.[0];
  console.log(match);
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...