regex:使用regex获取匹配字符串和剩余字符串

xdnvmnnf  于 2022-12-14  发布在  其他
关注(0)|答案(2)|浏览(357)

我想使用RegExp构造函数对一个字符串运行正则表达式,并获得匹配项和剩余的字符串。
以上是为了能够实现下面的UI模式:

如图所示,我需要将匹配与字符串的其余部分分离,以便能够单独应用某种样式或任何其他过程。

/**
 * INPUT 
 * 
 * input: 'las vegas'
 * pattern: 'las'
 *
 *
 * EXPECTED OUTPUT
 * 
 * match: 'las'
 * remaining: 'vegas'
 */
vwoqyblh

vwoqyblh1#

获取匹配项,然后用字符串中的空值替换匹配项,并返回两个结果。

function matchR(str, regex){
    // get the match
    var _match = str.match(regex);
    
    // return the first match index, and the remaining string
    return {match:_match[0], remaining:str.replace(_match, "")};
}
lyfkaqu1

lyfkaqu12#

下面是一个函数,它将用户输入和要匹配的字符串数组作为参数,并返回数组的数组:

const strings = [
  'Las Cruces',
  'Las Vegas',
  'Los Altos',
  'Los Gatos',
];

function getMatchAndRemaining(input, strings) {
  let escaped = input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
  let regex = new RegExp('^(' + escaped + ')(.*)$', 'i');
  return strings.map(str => {
    return (str.match(regex) || [str, '', str]).slice(1);
  });  
}

//tests:
['l', 'las', 'los', 'x'].forEach(input => {
  let matches = getMatchAndRemaining(input, strings);
  console.log(input, '=>', matches);
});

一些注意事项:

  • 在创建正则表达式之前,您需要对用户输入进行转义,有些字符具有特殊含义
  • 如果没有匹配项,则before部分为空,其余部分包含完整的字符串
  • 您可以向函数添加一个额外的参数,并将style或class添加到before部分,在这种情况下,您将返回一个字符串,而不是[before,remaining]数组

相关问题