Chrome regex.test()只能每隔一次工作

rks48beu  于 12个月前  发布在  Go
关注(0)|答案(2)|浏览(66)

Regex 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;
}

当你在白色处传递时,它每次都会阻止它。当你传入像'$a b'这样的东西时,它将在Firefox/Chrome中每隔一次工作。奇怪了

js4nwp54

js4nwp541#

这是RegEx引擎中的一个错误,这里出现了一个类似的问题。

基本情况是,带有g修饰符的/regex/不能正确重置,因此多个.test()调用在truefalse之间交替,如果每个人都应该是true,则每隔一次调用都会成功重置它。

njthzxwz

njthzxwz2#

更新:9/27/23 -我仍然遇到这个问题。
考虑以下情况:
1.你正在使用Angular的React式表单,并且正在使用一些内置的功能,比如开箱即用的Validators。
1.你可以使用类似下面的东西。

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;

其中每个验证器都是我在服务器上定义的对象,如下所示(例如):

{
"name": "lowercaseandunderscore"
"value": "^[a-z_]*$",
"type": "pattern",
"error": "Column names must only contain lower case letters and underscores"
}

现在,人们会假设这将固有地工作使用React形式,但它不!它和下面2021年的帖子福尔斯了同一个坑。别被骗了!
我今天偶然发现了这个。
奇怪的是,有效的方法如下:

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(/^[a-z_]*$/)));
              break;

这不是每一次都失败!
但是,如果你使用类创建一个Regex,使用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;

其中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;
    }
  }

当我今天处理这个问题的时候,我真的想“我肯定不会在正则表达式上遇到同样的问题……”。结果,我是。
每次创建带有字符串的RegExp时,都有一些话要说。用括号括起来就行了。不管出于什么原因,创建它时不使用字符串文字就可以正常工作。
我希望这一锤点回家。
从本质上讲,当从字符串字面量创建正则表达式时,它似乎行为不当,而当不是从字符串创建时,它似乎很好。
/更新结束
这似乎是2021年8月的一个问题...我只是想分享一些我在偶然发现这个问题和答案之前所学到的东西。我被这个问题所困扰,没有任何有意义的前进方向--直到现在。
1.无论您使用exec()还是test()match()都没有关系。正则表达式仍然不能在其他情况下正常工作。
1.如果你设置了正则表达式

let reg = new RegExp(/<table(\s*[^>]*)>/g);

或者const。不管你是全局设置还是局部设置。
要绕过这个问题,does 的工作是在循环中将regex语句 Package 在括号中,如下所示:

Object.keys(table).forEach(key => {
    if((new RegExp(/<table(\s*[^>]*)>/g)).test(___your test string___)){
        //Do what you need to do
    }
});

去掉正则表达式周围的括号,然后看着其他正则表达式失败......
非常感谢你的回答@Nick Craver和评论@prototype!
This exact Regex是给我带来麻烦的东西。它对一个对象有效,对下一个对象无效,这毫无意义。我在这里只是想说,这在2021年仍然非常重要。

相关问题