我在JavasScript中有一个非常长的与电子邮件匹配的正则表达式,我想在不更改正则表达式功能的情况下分成多行。我知道某些正则表达式引擎提供了一种插入换行符以提高可读性的方法,在JS中是否可以做到这一点?
答案 0 :(得分:4)
没有完成这些事情的内置方法,但是自己完成任务并不难。您可以将模板文字与String.raw
一起使用,这将允许您在正则表达式字符串中使用换行符,而不必重复转义反斜杠,然后可以将所有换行符替换为空字符串传递给new RegExp
之前:
const patternStr = String.raw`^
[fg]oo
=
\war`;
const pattern = new RegExp(patternStr.replace(/\n/g, ''));
console.log(pattern.test('foo=bar'));
console.log(pattern.test('goo=bar'));
console.log(pattern.test('hoo=bar'));
您也可以使用类似的技术来发表评论:
const patternStr = String.raw`
^ // Match the beginning of the string
[fg]oo // Match either f or g, followed by oo
= // Match an equals sign
\war // Match a word character, followed by "ar"
`;
const pattern = new RegExp(
patternStr.replace(/(?: *\/\/.*)?\n/g, '')
);
console.log(pattern.test('foo=bar'));
console.log(pattern.test('goo=bar'));
console.log(pattern.test('hoo=bar'));
(?: *\/\/.*)?\n
模式的意思是:
(?: *\/\/.*)?
-零个或多个空格的可选组,后跟//
,后跟非换行符
\n
-后跟换行符
当然,这意味着不可能像在正则表达式中那样写//
,但是没关系,就像正则表达式文字一样,您可以转义正斜杠(它将被解析)由RegExp构造函数作为不必要的转义字符)
const patternStr = String.raw`
^ // Match the beginning of the string
\/\/ // Match two literal forward slashes
`;
const pattern = new RegExp(
patternStr.replace(/(?: *\/\/.*)?\n/g, '')
);
console.log(pattern.test('//foo'));
console.log(pattern.test('foo'));
另一种方法是允许模板文字中的文字//
匹配注释// <text> \n
时,确保<text>
没有任何//
在里面。这意味着只有一行上的 final //
会被解析为注释,从而使您可以在该行的前面使用//
,而不会转义,不会出现问题,通过使用(?:(?!\/\/).)*
而不是.*
:
const patternStr = String.raw`
^ // Match the beginning of the string
// // Match two literal forward slashes
`;
const pattern = new RegExp(
patternStr.replace(/(?: *\/\/(?:(?!\/\/).)*)?\n/g, '')
);
console.log(pattern.test('//foo'));
console.log(pattern.test('foo'));
当然,这意味着//
仅在正则表达式中有另一个 //
时才被解析为正则表达式中的实际双正斜杠。 。 (如果以后没有其他//
,则必须改用\/\/
)