Javascript JS。如何通过连接变量来创建正则表达式模式

Javascript JS。如何通过连接变量来创建正则表达式模式,javascript,regex,Javascript,Regex,我无法修复以下问题: <html> <head> <title>Test</title> <script> function myFunction(arr) { var N = [0,1,2,3,4,5,6,7,8,9]; for (var s in N) { var pattern = new RegExp('/^[A-z]et_[' + s + ']_\\d/'); // N

我无法修复以下问题:

<html>
<head>
    <title>Test</title>

<script>
   function myFunction(arr) {
     var N = [0,1,2,3,4,5,6,7,8,9];
     for (var s in N) {

     var pattern = new RegExp('/^[A-z]et_[' + s + ']_\\d/');
     // NOTE I get the following, is that how it should be?
     // window.alert(pattern);  =>  /\/^[A-z]et_[0]_\d\//
     // NOTE: I checked that it works fine for a single digit case, say:
     // var pattern = new RegExp(/^[A-z]et_[3]_\d/);  
    var newarr = arr.filter(elt => pattern.test(elt));
    document.getElementById("demo").innerHTML = newarr;
    }}
</script>

</head>
<body>
<div id="demo" onclick="myFunction(['aaaLet_0_0', 'Let_1_99', 'Let_2_',   'Let_3_99', 'Pet_2_', 'Pet_3_99', '_9_33']);">click here</div>
<hr>
<p>expected output: Let_1_99, Let_3_99, Pet_3_99</p>
</body>
</html>

试验
函数myFunction(arr){
var N=[0,1,2,3,4,5,6,7,8,9];
for(N中的变量s){
var pattern=newregexp('/^[A-z]et.['+s+'].\\d/');
//注意,我得到以下信息,这是应该的吗?
//window.alert(模式);=>/\/^[A-z]et\[0]\ud\//
//注意:我检查过它是否适用于一位数的情况,例如:
//var模式=新的RegExp(/^[A-z]et_3]\ud/);
var newarr=arr.filter(elt=>pattern.test(elt));
document.getElementById(“demo”).innerHTML=newarr;
}}
点击这里

预期输出:Let_1_99,Let_3_99,Pet_3_99

我看到了许多类似的问题,但我一直无法找到如何修复我的代码。这应该是可能的,不是吗

编辑 以下是我需要的:

 <html>
 <head>
 <title>Test</title>
 <script>

 var newarr = [];
function myFunction(arr) {
    var N = [0,1,2,3,4,5,6,7,8,9];
    for (var s in N) {

    var pattern = new RegExp('^[A-z]et_' + s + '_\\d'); // NOTE: not /
    var lnewarr = arr.filter(elt => pattern.test(elt));
    if(typeof lnewarr !== 'undefined' && lnewarr.length > 0){newarr.push(lnewarr)};
    }
    document.getElementById("demo").innerHTML = newarr;
    }
   </script>

  </head>
  <body>
  <div id="demo" onclick="myFunction(['aaaLet_0_0', 'Let_1_99', 'Let_2_', 'Let_3_99', 'Pet_2_', 'Pet_3_99', '_9_33']);">click here</div>
  <hr>
  <p>expected output: Let_1_99, Let_3_99, Pet_3_99</p>
  </body>
  </html>

试验
var newarr=[];
函数myFunction(arr){
var N=[0,1,2,3,4,5,6,7,8,9];
for(N中的变量s){
var pattern=new RegExp('^[A-z]et_'+s+'\\\d');//注意:不是/
var lnewarr=arr.filter(elt=>pattern.test(elt));
if(typeof lnewarr!='undefined'&&lnewarr.length>0){newarr.push(lnewarr)};
}
document.getElementById(“demo”).innerHTML=newarr;
}
点击这里

预期输出:Let_1_99,Let_3_99,Pet_3_99


(很抱歉,如果我的文章大部分是代码。希望它能帮助其他人。)

你可以使用
来代替
循环。像这样加入

var pattern = new RegExp('^[A-Za-z]et_[' + N.join('') + ']_\\d');
//=> /^[A-Za-z]et_[0123456789]_\d/
这适用于数组中有单个字符值的情况
N

对于一般用途,可以使用以下表达式:

var pattern = new RegExp('^[A-Za-z]et_(?:' + N.join('|') + ')_\\d');
//=> /^[A-Za-z]et_(?:0|1|2|3|4|5|6|7|8|9)_\d/

使用for循环可以执行以下操作:

var N = [0,1,2,3,4,5,6,7,8,9];
var str='(?:';
for (var s in N)
   str += s + '|';    
str = str.replace(/\|$/, ')');

var pattern = new RegExp('^[A-Za-z]et_' + str + '_\\d');
//=> /^[A-Za-z]et_(?:0|1|2|3|4|5|6|7|8|9)_\d/

是的,很有效,谢谢。让我问一下,for循环有什么问题?有办法保存它吗?(我问题中的例子来自一段较大的代码,其中我需要一个for循环)。@anubhave,我困惑的是我们如何在regexp()中编写regexp。看来我应该避免使用“/”。谢谢你的帮助。我想我不明白为什么正则表达式不仅仅是
/^[A-z]et\ud\ud/
。。。这个<代码>变量模式=/^[A-z]et\ud\ud//
var arr=['aaaLet_0_0'、'Let_1_99'、'Let_2_99'、'Let_3_99'、'Pet_2_99'、'Pet_3_99'、'u 9_33'/
var lnewarr=arr.filter(elt=>pattern.test(elt))/产生:
[“Let_1_99”、“Let_3_99”、“Pet_3_99”]