regex.test()只能每隔一段时间运行一次

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()之间的呼叫交替truefalse如果每个人都应该true,所有其他的呼叫成功重置它.

  • 到底是什么翻转...我快疯了,为什么我的“console.log”返回“true”,但我的“if”条件紧随其后却是“false” (4认同)
  • 我只是想说,10年后这个问题在Chrome 81中仍然出现 (4认同)
  • 对于我来说,将正则表达式包装起来,例如“pattern”到“(new RegExp(pattern))”似乎有效 (2认同)
  • 这是一个测试多个匹配的功能。如果匹配新字符串,最好在使用“test”之前先设置“r.lastIndex = 0”。您还可以在一行 if 语句中使用它,如下所示:`if(r.lastIndex = 0 || r.test(str)){ ... }`。 (2认同)

Wil*_*lie 5

更新:23 年 9 月 27 日 - 我仍然遇到这个问题。

考虑以下:

  1. 您正在使用 Angular 反应式表单,并使用一些内置功能,例如开箱即用的验证器。
  2. 你使用类似下面的东西。
      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 月仍然是一个问题……我只想分享我在偶然发现这个问题和答案之前学到的一些东西。我对这个问题感到困惑,并且没有任何有意义的前进方向 - 直到现在。

  1. exec()使用或test()或并不重要match()。正则表达式仍然无法在其他所有情况下正常工作。

  2. 如果你设置正则表达式并不重要

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 年仍然非常重要