繁体   English   中英

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

[英]JS. How do I create a regex pattern by concatenation with variables

我无法解决以下问题:

<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>

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

编辑以下是我需要的:

 <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>

(对不起,如果我的帖子主要是代码。希望它可以帮助那里的人。)

您可以使用.join代替for循环:

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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM