我的意思是,而不是
/^[asdfjkl;]foo[asdfjkl;]bar[asdfjkl;]baz$/i
甚至
RegExp('^[[:HOMEROW:]]foo[[:HOMEROW:]]bar[[:HOMEROW:]]baz$'.replace(/\[:HOMEROW:]/g, 'asdfjkl;'))
我可能只能写:
/\H=[asdfjkl;];^\Hfoo\Hbar\Hbaz$/
我的意思是,而不是
/^[asdfjkl;]foo[asdfjkl;]bar[asdfjkl;]baz$/i
甚至
RegExp('^[[:HOMEROW:]]foo[[:HOMEROW:]]bar[[:HOMEROW:]]baz$'.replace(/\[:HOMEROW:]/g, 'asdfjkl;'))
我可能只能写:
/\H=[asdfjkl;];^\Hfoo\Hbar\Hbaz$/
您可以为 RegExp 创建一个包装器对象:
myRegExp = function(regex,mods) {
var customclasses = {
nonDotLocalChar:'A-Za-z0-9!#$%&\'*+-/=?^_`{|}~'
}, i;
for( i in customclasses) {
regex = regex.replace(new RegExp("\[:(\^?)"+i+":\]","i"),"$1"+customclasses[i]);
}
return new RegExp(regex,mods);
};
然后你可以像这样使用上面的:
var eam = new myRegExp("^[[:nondotlocalchar:]](?(?:[[:nondotlocalchar:]].........");
你也可以像这样使用它:
new myRegExp("[[:^nondotlocalchar:]]"); // negates the custom class
new myRegExp("[@[:nondotlocalchar:]]"); // allow anything from the custom class, or the @ character
既然你问的是一个哲学问题(对于像 SO 这样的网站来说,这并不是一个很好的问题),让我试着给出一个相当推测的答案。毕竟,我不能代表语言设计者说话,但我可以猜到:
通常,当一个正则表达式变得如此可怕时,这是一个可靠的信号,表明正则表达式不是适合这项工作的工具。所以在某种程度上,自定义字符类会鼓励糟糕的编程(比如尝试使用正则表达式验证电子邮件地址)。我怀疑这就是为什么没有足够聪明来定义正则表达式标准的人选择实现此功能的原因。
例如,如果您的目标是查找电子邮件地址,那么最好使用基本的正则表达式进行非常基本的扫描,例如
\S+@\S+\.\S+
然后使用专用的电子邮件地址解析器查看结果以清除/修剪不匹配项。
一个更好的例子可能是日期验证:
您可以使用正则表达式验证 MM/DD/YYYY 日期
^(?:(?:(?:(?:(?:0?[13578]|1[02])\/31)|(?:(?:0?[13-9]|1[0-2])\/(?:29|30)))\/(?:1[6-9]|[2-9]\d)\d{2})|(?:0?2\/29\/(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))\/(?:0?[1-9]|1\d|2[0-8])\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$
但你可能更应该使用像这样的正则表达式
^\d\d/\d\d/\d\d\d\d$
并使用日期解析器在第二步中找出有效日期。