如何在JavaScript中连接正则表达式文本?

2022-08-30 02:00:31

有可能做这样的事情吗?

var pattern = /some regex segment/ + /* comment here */
    /another segment/;

还是我必须使用新语法并连接字符串?我更喜欢使用文字,因为代码既不言自明又简洁。RegExp()


答案 1

下面介绍如何在不使用正则表达式文本语法的情况下创建正则表达式。这使您可以在字符串成为正则表达式对象之前对其进行任意操作:

var segment_part = "some bit of the regexp";
var pattern = new RegExp("some regex segment" + /*comment here */
              segment_part + /* that was defined just now */
              "another segment");

如果您有两个正则表达式文本,则实际上可以使用以下技术将它们连接起来:

var regex1 = /foo/g;
var regex2 = /bar/y;
var flags = (regex1.flags + regex2.flags).split("").sort().join("").replace(/(.)(?=.*\1)/g, "");
var regex3 = new RegExp(expression_one.source + expression_two.source, flags);
// regex3 is now /foobar/gy

它只是更冗长,而不仅仅是让表达式一和表达式二是文字字符串而不是文字正则表达式。


答案 2

只是随机连接正则表达式对象可能会产生一些不良副作用。请改用 RegExp.source

var r1 = /abc/g;
var r2 = /def/;
var r3 = new RegExp(r1.source + r2.source, 
                   (r1.global ? 'g' : '') 
                   + (r1.ignoreCase ? 'i' : '') + 
                   (r1.multiline ? 'm' : ''));
console.log(r3);
var m = 'test that abcdef and abcdef has a match?'.match(r3);
console.log(m);
// m should contain 2 matches

这还将使您能够使用标准正则表达式标志保留先前正则表达式标志。

jsFiddle