包含重复模式的正则表达式可以用简写或其他技术减少吗



背景(下面的正则表达式模式看起来很长,但大部分由重复模式组成。

此范围使用3次,

[a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\]   

var repeatingPattern = /^[a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\](( [a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\])|([a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\]))/

此正则表达式的英文翻译为:

  1. 第一个字符必须在范围内
  2. 第二个字符必须是一个空格,后面跟一个范围内的字符
  3. 或者第二个字符必须是范围内的字符

问题(我写了这么多次这个范围,有没有办法用速记或其他技术做到这一点?

JavaScriptRegExp不支持正则表达式子例程,因此您不能在JavaScript正则表达式中定义模式并从同一正则表达式中引用相同的模式

为什么不使用RegExp构造函数和字符串?

在ES6:中

const pattern = '[a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\]';
const regex = new RegExp(`^${pattern}((${pattern})|(${pattern})`);

(我假设我在构造函数中正确匹配了模式!我可能在这里或那里漏掉了一个字符。(

您可以使用您的范围,添加一个带有空格和范围的非捕获组,并使用量词{2}重复该组2次

您可以使用边界^$来断言字符串的开始和结束。

^[a-zA-Z0-9&+".;!'|?((,~[{}_:`*#\/\-\^\]\\](?:[a-zA-Z09&+".!'|((,~[{}_:`**#\/\\-\^\]\\]({2}$

Regex演示

var repeatingPattern = /^[a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\](?: [a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\]){2}$/;
var strings = [
'a { #',
'a { # %',
'#'
];
strings.forEach((s) => {
console.log(s + " ==> " + repeatingPattern.test(s));
});

编辑

如果您想捕获2个字符,其中第二个字符前面可以有一个可选的空白,您可以使用一个空白后面跟着一个问号?

如果您想捕获包括可选空白的第二个字符,可以在组()中捕获它。

^[a-zA-Z0-9&+".;!'|?((,~[{}_:`*#\/\-\^\]\\](?[a-zA-Z09&+".;!'|?(

var repeatingPattern = /^[a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\]( ?[a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\])$/;
var strings = [
'a #',
'a { #',
'a { # %',
'#'
];
strings.forEach((s) => {
console.log(s + " ==> " + repeatingPattern.test(s));
});

最新更新