检查字符串中是否包含一组字符串

Check if a set of string is contained in a string

我遇到了 Angular/Typescript 的问题,但它可以应用于大多数编程语言。

我有一个巨大的文本,我们将称之为 fulltext 和一组应用于全文并知道它们是否匹配的 filters ;让我更好地解释一下:

假设我们的全文是这样的

"Hello there! My name is Mattia"

过滤器是

["my name", "is Mattia"]

首先,我执行了一个对全文和过滤器进行 stamming 和清理的操作,应用正则表达式和替换。

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

所以现在我可以避免各种误报,例如 "Mattia" 和 "mattia" 之间的不匹配等...

此时答案可能很简单:我只是滚动过滤器列表并使用 "include" 字符串方法。但是假设您使用 "mat" 而不是 "mattia" 作为过滤器。 Include 使用子串,所以它 return 在任何情况下都是正确的。

在我的上下文中,全文中包含一些名为 "sections" 的对象,这些对象通过罗马数字编号(i、ii、iii、...)进行了编号。因此,在应用 "section i" 过滤器的情况下,所讨论的方法必须 return false if present "... section ii ...", "... section iii ...".

我差点忘了,必须满足所有过滤器,所以即使一个不匹配,该方法也必须 return false。

我希望我已经尽可能清楚地说明了问题。

我建议使用 word boundary 正则表达式断言:

// 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);

只要确保过滤器不包含任何正则表达式特殊字符:)

我使用了 Jan Jakub Nanista 的答案并编写了一个函数并在其中添加了忽略大小写。

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;
    }