我可以在RegExp声明中实时内联执行函数吗?

时间:2016-02-27 04:33:39

标签: javascript regex

我的目标是获得以下正则表达式变量:

const r = /(fruits)\/(apple|mango|dragon-fruit)/i;

为了实现它,我想执行一个操作,如下所示:

const fruitsArray = ['apple', 'mango', 'dragon fruit'];
const r = /(fruits)\/(fruitsArray.join('|').replace(/\s+/g, '-'))/i;

或者至少像这样 - 放置一个字符串变量:

const fruitsArray = ['apple', 'mango', 'dragon fruit']
let str = fruitsArray.join('|').replace(/\s+/g, '-'); // "apple|mango|dragon-fruit"
const r = /(fruits)\/(str)/i;

对于第二种情况,我知道我可以使用RegExp构造函数:

const r = new RegExp('fruits/' + str, 'i');

但我想在/foo/i regexp声明版本中执行操作。

JS可以吗?要么在regexp中执行内联函数,要么在regexp中放置一个字符串变量。

1 个答案:

答案 0 :(得分:1)

您可以Array#mapString#replace一起使用连字符-替换数组元素中的所有空格。使用Array#join通过管道|(RegEx中的OR条件)将数组元素作为粘合剂连接起来。字符串连接运算符+用于连接括号()(在RegEx中分组和捕获字符)。

要动态创建字符串的正则表达式,您必须使用RegExp构造函数语法。

new RegExp('fruits\/' + '(' + fruitsArray.map(str => str.replace(/\s+/g, '-')).join('|') + ')', 'i');

<强>解体:

  1. 用连字符-

    替换数组元素中的所有空格
    fruitsArray.map(str => str.replace(/\s+/g, '-'))
    
  2. 使用管道|作为粘合剂

    加入数组
    .join('|')
    
  3. Concat分组字符()

    '(' + resultingString + ')'
    
  4. 要动态创建字符串的RegEx,请使用RegExp构造函数

    new RegExp('fruits\/' + string, 'i')
    
  5. <强>演示:

    (function () {
        'use strict';
    
        const fruitsArray = ['apple', 'mango', 'dragon fruit'];
        const regex = new RegExp('fruits\/' + '(' + fruitsArray.map(str => str.replace(/\s+/g, '-')).join('|') + ')', 'i');
    
        document.body.innerHTML = regex;
    }());

    注意:正斜杠/需要通过在RegEx中使用反斜杠进行转义,因为RegEx使用正斜杠作为分隔符。