Jac*_*nkr 31 javascript regex safari firefox google-chrome
正则表达式test()给我提供了Firefox和Chrome的问题,但它在Opera和Safari中运行完美.
麻烦的代码:
var pattern = /(\s+(?!\$\w+)|(^(?!\$\w+)))/g;
if(pattern.test(String(id).replace(/\s+OR|AND\s+/g, ''))) {
searchError("You suck.");
return 1;
}
Run Code Online (Sandbox Code Playgroud)
当你传入白色空间时,它每次都会阻挡它.当你传递类似的东西时'$a b',它将在Firefox/Chrome中每隔一段时间都有效.奇怪的.
Nic*_*ver 69
这是RegEx引擎中的一个错误,类似的问题出现了同样的问题.
从我对这个问题的回答:这是在ECMAScript 3中实现正则表达式的一个错误,这里有一篇很好的帖子.
基本是一个/regex/与g修改不正确地重置,所以多.test()之间的呼叫交替true和false如果每个人都应该是true,所有其他的呼叫成功重置它.
更新:23 年 9 月 27 日 - 我仍然遇到这个问题。
考虑以下:
form.forEach((formField: any) => {
let validatorsArray = formField.validators?.reduce((validators: any, validator: any) => {
switch(validator.type){
case 'required':
validators.push(Validators.required);
break;
case 'pattern':
validators.push(Validators.pattern(new RegExp(validator.value)));
break;
Run Code Online (Sandbox Code Playgroud)
其中每个验证器都是我在服务器上定义的一个对象,如下所示(例如):
{
"name": "lowercaseandunderscore"
"value": "^[a-z_]*$",
"type": "pattern",
"error": "Column names must only contain lower case letters and underscores"
}
Run Code Online (Sandbox Code Playgroud)
现在,人们会认为这本质上可以使用反应形式来工作,但事实并非如此!和下面2021年的帖子掉进了同一个坑。别被骗了!
我今天遇到了这个。
奇怪的是,有效的方法如下:
{
"name": "lowercaseandunderscore"
"value": "^[a-z_]*$",
"type": "pattern",
"error": "Column names must only contain lower case letters and underscores"
}
Run Code Online (Sandbox Code Playgroud)
这不会每次都失败!
但是,如果您通过使用类、使用 STRING 创建正则表达式...请注意。你必须做这样的事情。
form.forEach((formField: any) => {
let validatorsArray = formField.validators?.reduce((validators: any, validator: any) => {
switch(validator.type){
case 'required':
validators.push(Validators.required);
break;
case 'pattern':
validators.push(this.testValue(validator));
break;
Run Code Online (Sandbox Code Playgroud)
其中您的 testValue 函数如下:
private testValue(validator: any): ValidatorFn {
return (control: AbstractControl) => {
let returnVal = null;
if(control.value){
//NOTE the use of parenthesis around the RegExp below.
if((new RegExp(validator.value, 'gm').test(control.value))){
return null;
} else {
return {[validator.name]: validator.error};
}
}
return returnVal;
}
}
Run Code Online (Sandbox Code Playgroud)
当我今天解决这个问题时,我真诚地想“我肯定不会在正则表达式中遇到同样的问题......”。事实证明,我是。
每次使用字符串创建 RegExp 时,都有一些事情要说。只需将其括在括号中即可。无论出于何种原因,在不使用字符串文字的情况下创建它都可以正常工作。
我希望这能击中要点。
从本质上讲,正则表达式在从字符串文字创建时似乎行为不当,而在不从字符串创建时似乎表现得很好。
///更新结束
这似乎在 2021 年 8 月仍然是一个问题……我只想分享我在偶然发现这个问题和答案之前学到的一些东西。我对这个问题感到困惑,并且没有任何有意义的前进方向 - 直到现在。
exec()使用或test()或并不重要match()。正则表达式仍然无法在其他所有情况下正常工作。
如果你设置正则表达式并不重要
let reg = new RegExp(/<table(\s*[^>]*)>/g);
Run Code Online (Sandbox Code Playgroud)
或与const. 无论您在全局还是本地设置它都没有关系......
绕过这个问题的方法是将正则表达式语句包装在循环中的括号中,如下所示:
Object.keys(table).forEach(key => {
if((new RegExp(/<table(\s*[^>]*)>/g)).test(___your test string___)){
//Do what you need to do
}
});
Run Code Online (Sandbox Code Playgroud)
删除正则表达式周围的括号,然后观察其他每个都失败......
非常感谢您的回答@Nick Craver 和评论@prototype!
这个正则表达式给我带来了麻烦。它对一个对象有效,但对后续对象无效,而且没有任何意义。我在这里只是想说,这在 2021 年仍然非常重要。
| 归档时间: |
|
| 查看次数: |
5321 次 |
| 最近记录: |