regex JavaScript中的字符串与排序规则的比较

zxlwwiss  于 2023-06-07  发布在  Java
关注(0)|答案(2)|浏览(133)

我使用jquery.autocomplete,它使用javascript regexp突出显示建议列表中与自动完成键字符串匹配的子字符串。因此,如果使用类型“Beat”,并且服务器返回的自动完成建议之一是“The Beatles”,则插件将该建议显示为“TheBeatles”。
我正在想办法让这个工作与字符串匹配,是不敏感的口音,变音符号和休息。因此,如果用户输入“Huske”,而服务器建议“Hüsker Dü”,则这将显示为“Hüsker Dü”。
其原理与使用指定的排序规则(如MySql或ICU中的排序规则)或Oracle的排序进行字符串比较相同。在SphinxSearch中,一个charset_table就可以实现这一点。像utf8_general_ci这样的排序规则对于我的目的是理想的。

6ojccjat

6ojccjat1#

我唯一能想到的就是蛮力如果已知输入字符串中的任何字符具有一个或多个重音形式,则在创建正则表达式时将其替换为包含 * 所有 * 形式的字符类。例如,对于输入字符串Huske,正则表达式可能是/H[uùúûü]sk[eèéêë]/

6rqinv9w

6rqinv9w2#

(我宁愿把这篇文章作为评论贴出来,并附上原始答案的链接,但我在发帖时没有足够的“声誉”来发表评论)。

const collator = new Intl.Collator('en', { sensitivity: 'base', usage: 'search' });
function contains(string, substring) {
  if (substring.length === 0) {
    return true;
  }
  string = string.normalize('NFC');
  substring = substring.normalize('NFC');
  let scan = 0;
  for (; scan + substring.length <= string.length; scan += 1) {
    const slice = string.slice(scan, scan + substring.length);
    if (collator.compare(substring, slice) === 0) {
      return true;
    }
  }
  return false;
}

contains("Hüsker Dü", "Huske")
true

参见https://github.com/adobe/react-spectrum/blob/7f63e933e61f20891b4cf3f447ab817f918cb263/packages/%40react-aria/i18n/src/useFilter.ts#L58

相关问题