Разобрать массив RegEx из строки - PullRequest
3 голосов
/ 21 января 2020

У меня есть компонент, использующий реакцию с masked-input. Этот компонент использует массив RegEx для работы:


import React from 'react'
import MaskedInput from 'react-text-mask'

export default () => (
  <div>
    <MaskedInput
      mask={['(', /[1-9]/, /\d/, /\d/, ')', ' ', /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/]}
    />
  </div>
)

Я получаю значение маски из удаленного API, маска выглядит как строка:

var mask = '[/d/, /d/, " / ", /d/, /d/, " / ", /d/, /d/, /d/, /d/]'

Как я могу преобразовать это строка в допустимый массив RegEx и строк?

От

var mask = '[/d/, /d/, " / ", /d/, /d/, " / ", /d/, /d/, /d/, /d/]'

до

var mask = [/d/, /d/, " / ", /d/, /d/, " / ", /d/, /d/, /d/, /d/]

Ответы [ 3 ]

1 голос
/ 21 января 2020

Вы можете попытаться сделать al oop для каждого элемента и поместить их в RegExp class:

var mask = '[/d/, /d/, " / ", /d/, /d/, " / ", /d/, /d/, /d/, /d/]';

mask = mask.substring(1, mask.length - 1);

var patterns = [];

for (var pattern of mask.split(',')) {
  pattern = pattern.trim().replace(/(^\/)|(\/$)|(^")|("$)/g, '');
  
  patterns.push(new RegExp(`${pattern}`));
}

console.log(patterns);
console.log(patterns[0].test('d'));

Если вы хотите сохранить элемент, содержащий " / " в виде строки, а не шаблон регулярного выражения. В стороне l oop, вы можете отредактировать его на:

for (var pattern of mask.split(',')) {
  pattern = pattern.trim().replace(/(^\/)|(\/$)/g, '');

  patterns.push(/^".+"$/.test(pattern) ? pattern.replace(/"/g, '') : new RegExp(`${pattern}`));
}
0 голосов
/ 21 января 2020

Поскольку ваша строка включает в себя заключающие в скобки, самый простой способ преобразовать вашу строку в массив регулярных выражений:

var arr = eval(mask);

Затем вы можете проверить свои значения следующим образом:

arr[0].test('d')
true
arr[0].test('e')
false

Этот метод оставит ваши записи "/" в виде строк.

0 голосов
/ 21 января 2020

Вы можете нарезать строку и затем преобразовать ее в массив, затем использовать new RegExp для преобразования каждого элемента в регулярное выражение:

var mask = '[/d/, /d/, " / ", /d/, /d/, " / ", /d/, /d/, /d/, /d/]';

const arrayRegex = mask.slice(1, mask.length - 1).split(",").map(reg => new RegExp(reg.trim()));



console.log(arrayRegex);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...