Проверить, содержится ли набор строк в строке - PullRequest
0 голосов
/ 25 мая 2020

У меня проблема с Angular / Typescript, но его можно применить на большинстве языков программирования.

У меня есть огромный текст, который мы назовем fulltext и набор фильтров , которые применяются к полному тексту и знают, совпадают ли они; позвольте мне объяснить лучше:

предположим, что наш полный текст выглядит примерно так

«Здравствуйте! Меня зовут Маттиа»

и фильтры

[«меня зовут», «это Маттиа»]

Прежде всего, я выполняю операцию заикания и очистки полного текста и фильтров, применяя регулярное выражение и заменяю .

document.snippet.toLowerCase().replace(/[^A-Z0-9]/ig, "");
filter.toLowerCase().replace(/[^A-Z0-9]/ig, "");

Так что теперь я могу избежать различных ложных срабатываний, таких как несоответствие между «Mattia» и «mattia» и т. Д. c ...

На этом этапе ответ может быть следующим: тривиально: я просто прокручиваю список фильтров и использую строковый метод "include". Но предположим, что у вас есть «mat» вместо «mattia» в качестве фильтра. Include использует подстроку, поэтому в любом случае вернет true.

В моем контексте у меня есть некоторые объекты, называемые «секциями», пронумерованные до латинского алфавита c нумерация (i, ii, iii, ...) содержится в полном тексте. Таким образом, если применяется фильтр «section i», рассматриваемый метод должен возвращать false, если присутствует «... section ii ...», «... section iii ...».

I почти забыл, все фильтры должны быть удовлетворены, поэтому, если хотя бы один из них не соответствует, метод должен возвращать false.

Надеюсь, я прояснил проблему, насколько могу.

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Я использовал ответ Яна Якуба Нанисты и написал функцию и добавил в нее игнорирование регистра.

checkFilters(inputString: string, filters: string[]) : boolean {
      filters.forEach((filter) => {
        const regexp = new RegExp('\\b' + filter + '\\b', 'ig');
        if(!regexp.test(inputString)){
          return false;
        }
      })
      return true;
    }
1 голос
/ 25 мая 2020

Я бы предложил использовать границу слова утверждение регулярного выражения:

// You can add an 'i' flag as well and you don't need to lowercase your string!
const regex = new RegExp('\\b' + filter + '\\b', 'g'); 
const match = fulltext.match(regex);

Просто убедитесь, что фильтр не содержит никаких специальных символов регулярного выражения :)

...