regex 如何根据正则表达式字符串验证字符串

omvjsjqw  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(215)

我有一个包含以下正则表达式字符串的数组。

var fieldTypes = [
{
    '/^[0-9]+$/',
    '/^(true|false)$/i',
    '/^\\d{4}-\\d{2}-\\d{2}$/',
    '/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/i',
    'yyyy-mm-ddThh:mm',
];

现在我如何测试一个字符串是否与其中一个匹配呢?
我正在尝试这样的东西。

var value = 'some string';
if (!value.test(fieldTypes[0])) {
    alert('The value is not in the correct format.');
    return;
}

但这会产生一个错误,即test()不是一个函数。显然,它不能直接在字符串上调用。但是如何从字符串中获取有效的正则表达式对象呢?

更新:

答案是“完全不同”。请在结束之前阅读问题。我有绳子。他们来自另一个来源。它无法改变。我很清楚地问我如何从字符串中获得有效的正则表达式。如果没有办法,那就是答案。但是告诉我使用正则表达式字面量并不是答案。

klsxnrf1

klsxnrf11#

如果不能修改数组,则可能需要来解析字符串并生成regex objects
出于解析的目的,使用一些简单的模式,如:^(?:\/(.*)\/([a-z]*)|.*)$
它包含两个options:交替\/(.*)\/([a-z]*)的左侧将capture模式部分放入 * 第一组 *,并将任何标志(如i)放入 * 第二组 。如果没有找到分隔符(如果左侧失败),则右侧.*匹配任何其他内容。最后使用new RegExp构造正则表达式。
进一步注意,顺序是regex.test(value)
不是 *,反之亦然(容易与match混淆)。

var fieldTypes = [
  '/^[0-9]+$/',
  '/^(true|false)$/i',   
  '/^\\d{4}-\\d{2}-\\d{2}$/',
  '/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/i',
  'yyyy-mm-ddThh:mm'
];

var value = '2000-01-01';

// parse string to regex
function strToRegex(s)
{
  let m = s.match(/^(?:\/(.*)\/([a-z]*)|.*)$/);
  if(m[1])
    return new RegExp(m[1], m[2]); // delimiters
  return new RegExp(m[0]); // no delimiters
}

// test value against regex
fieldTypes.forEach(regex_str =>
{
  let regex = strToRegex(regex_str);
  console.log(regex, '=>', regex.test(value));
});

相关问题