【问题标题】:Match a string with an array将字符串与数组匹配
【发布时间】:2019-07-18 02:26:03
【问题描述】:

我有一个这样的数组...

var array = ['aaa', 'bb', 'ccc', 'dddd', 'eee', 'fff'];

另外,我有一个这样的字符串:

5000aaa

或者像这样……

50bb

该字符串会有所不同,我需要将匹配部分 (aaa) 放入一个变量中并将其从现有字符串中删除。

最终的结果应该是这样的:

var array = ['aaa', 'bb', 'ccc', 'dddd', 'eee', 'fff'];
var oldString = '5000aaa';
var matchedPart = 'aaa';
var newString = '5000';

问题是匹配长度是变化的,而且字符串是动态的(从输入的值中获取)但是,每次匹配的部分只包含在末尾。

我不知道如何使用纯 Javascript 或 ES2015 或 VueJS 来做到这一点。谁能指导我?

【问题讨论】:

标签: javascript html arrays vue.js


【解决方案1】:

一种方法是使用带有 alternation 的正则表达式并捕获组,如下所示:

var regex = new RegExp("(\\d+)(" + array.join("|") + ")");

| 定义了一系列备选方案,其中任何一个都可以匹配。比如:

var array = ['aaa', 'bb', 'ccc', 'dddd', 'eee', 'fff'];
var regex = new RegExp("(\\d+)(" + array.join("|") + ")");
var str = "500bb";
var match = regex.exec(str);
console.log(match[1]); // 1st capture group: "500"
console.log(match[2]); // 2nd capture group: "bb"

注意:如果数组中的文本可以包含任何在正则表达式中具有特殊含义的字符(如| 或? 或.),则需要转义将它们传递给RegExp 构造函数时的那些。在this question's answers 中有多种方法可以做到这一点。你可以像这样将它应用到上面:

var regex = new RegExp("(\\d+)(" + array.map(function(entry) {
    return rexEscape(entry);
}).join("|") + ")");

...rexEscape 是您最终定义和使用的任何转义函数。

【讨论】:

    【解决方案2】:

    您可以存储替换的字符串并使用带有可选模式的正则表达式进行搜索。

    var array = ['aaa', 'bb', 'ccc', 'dddd', 'eee', 'fff'],
        replaced,
        string = '5000aaa',
        newString = string.replace(new RegExp(array.join('|')), s => (replaced = s, ''));
    
    console.log(replaced);
    console.log(newString);

    【讨论】:

      【解决方案3】:

      您可以使用 forEach 循环遍历数组,创建一个仅匹配数组的正则表达式,如果匹配,则返回它。

      let array = ['aaa', 'bb', 'ccc', 'dddd', 'eee', 'fff'];
      let oldString = "5000aaa";
      let matchedPart;
      let newString;
      let re;
      
      array.forEach((e) => {
        re = new RegExp(e, "g");
        if (oldString.match(re) != null) {
          matchedPart = oldString.match(re).join('');
          newString = oldString.replace(re, '');
        }
      });
      
      console.log(newString);
      console.log(matchedPart);

      【讨论】:

        【解决方案4】:

        可以使用简单的 Array 和 String 原型来完成。使用大量的正则表达式可以更简单地完成,但我个人避免使用正则表达式,就像它的瘟疫一样。示例如下:

        function filterWord(oldString) {
        
          // Words that need to be left removed
          const arrayOfWords = ['aaa', 'bbb', 'ccc']
        
          // Filter though those words
          const filterWord = arrayOfWords.filter(function(word) {
        
            // Does string of aray include oldString?
            if (oldString.includes(word)) return word;
          });
        
          // If there was no match in filtering, 0 index will be undefined
          const matchedWord = filterWord[0] || false;
        
          // If there where no matchs, return false
          if (!matchedWord) return false;
        
          // Remove forbiden part from oldString with string.replace
          const newString = oldString.replace(new RegExp(matchedWord,"g"), "");
        
          return  {
            oldString: oldString,
            matchedPart: matchedWord,
            newString: newString
          }
        
        }
        
        console.log(filterWord('500aaa'));
        

        【讨论】:

          【解决方案5】:

          您可以简单地使用正则表达式来解决您的问题。

           var array = ['aaa', 'bb', 'ccc', 'dddd', 'eee', 'fff'];
              var oldString = "5000aaa";
              var regexStr = oldString.match(/[a-z]+|[^a-z]+/g); 
          
              console.log({"oldString": oldString,
              "matchedPart": regexStr[1],
              "newString": regexStr[0]});
          

          【讨论】:

            【解决方案6】:

            如果模式是始终位于末尾的简单字符串,那么我认为您不需要正则表达式。

            我将创建一个函数splitFunction,它接受一个模式数组并返回一个函数,该函数接受一个字符串并检查它是否以一个模式结尾。它返回一个包含新字符串和匹配模式的数组。

            通过返回一个数组,您可以使用destructuring assignment。

            const splitFunction = patterns => str => {
              const pattern = patterns.find(p => str.endsWith(p));
              return !pattern ? [] : [str.slice(0, -pattern.length), pattern];
            };
            
            const split = splitFunction(['aaa', 'bb', 'ccc', 'dddd', 'eee', 'fff']);
            
            const [newString, match] = split('500aaa');
            
            console.log(newString, match);

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-04-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-02-27
              • 2011-07-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多