背景(下面的正则表达式模式看起来很长,但大部分由重复模式组成。
此范围使用3次,
[a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\]
var repeatingPattern = /^[a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\](( [a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\])|([a-zA-Z0-9&+".;!'|?(),~[{}<>_:`*#/-^]\]))/
此正则表达式的英文翻译为:
- 第一个字符必须在范围内
- 第二个字符必须是一个空格,后面跟一个范围内的字符
- 或者第二个字符必须是范围内的字符
问题(我写了这么多次这个范围,有没有办法用速记或其他技术做到这一点?
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)); });