我的目标是获得以下正则表达式变量:
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中放置一个字符串变量。
答案 0 :(得分:1)
您可以Array#map
与String#replace
一起使用连字符-
替换数组元素中的所有空格。使用Array#join
通过管道|
(RegEx中的OR条件)将数组元素作为粘合剂连接起来。字符串连接运算符+
用于连接括号(
和)
(在RegEx中分组和捕获字符)。
要动态创建字符串的正则表达式,您必须使用RegExp
构造函数语法。
new RegExp('fruits\/' + '(' + fruitsArray.map(str => str.replace(/\s+/g, '-')).join('|') + ')', 'i');
<强>解体:强>
用连字符-
fruitsArray.map(str => str.replace(/\s+/g, '-'))
使用管道|
作为粘合剂
.join('|')
Concat分组字符(
和)
'(' + resultingString + ')'
要动态创建字符串的RegEx,请使用RegExp
构造函数
new RegExp('fruits\/' + string, 'i')
<强>演示:强>
(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使用正斜杠作为分隔符。