将字符串与数组匹配

时间:2019-02-24 15:23:06

标签: javascript html arrays vue.js

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

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做到这一点。谁能指导我?

6 个答案:

答案 0 :(得分:2)

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

Shaderc Lint: config.glslcPath is empty, please set it to the executable

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"|?),在将它们传递给.构造函数时,您需要对其进行转义。 this question's answers中有多种方法可以做到这一点。您可以像这样将其应用到上面:

RegExp

...其中var regex = new RegExp("(\\d+)(" + array.map(function(entry) { return rexEscape(entry); }).join("|") + ")"); 是您最终定义和使用的任何转义函数。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可以使用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);

答案 3 :(得分:0)

可以使用简单的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'));

答案 4 :(得分:0)

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

@Override
public boolean onTouchEvent(MotionEvent event) {
    return this.mGestureDetector.onTouchEvent(event);
}

答案 5 :(得分:0)

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

我将创建一个函数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);