0

I have a function that tests a RegExp, but it returns true half the times, with the same values!

(I modified the code to show the problem, because in the project the function is fired everytimes the user digits something)

Where do I wrong?

intent.js file:

    var intentTags = [
        {
            desc: 'elenca numeri telefonici',
            type: 'numero',
            phrases: ['numero', 'numeri'],
            regex: new RegExp( /(?<!\w)(nu?m?e?r?[oi]?)\b/, 'gi' )
        },
    ]

    module.exports = {

        attivati: function attivati(digitato) {
            return intentTags[0].regex.test( digitato )
        }

    }

nodejs file:

    var intent = require('./intent')

    var val = "numeri"

    var result1 = intent.attivati( val );
    var result2 = intent.attivati( val );
    var result3 = intent.attivati( val );
    var result4 = intent.attivati( val );
    var result5 = intent.attivati( val );
    var result6 = intent.attivati( val );

    console.log( val, "returns: ", result1, result2, result3, result4, result5, result6 );

espected result: numeri returns: true true true true true true

actual result: numeri returns: true false true false true false

  • 1
    It's because the `g` flag makes the regex *stateful*, so consequitive calls will produce different results. – VLAZ Jan 30 '19 at 11:23

1 Answers1

0

As @vlaz worte, it is because the g flag makes the regex stateful, so consecuitive calls will produce different results.

You need to delete the g from RegExp

look this exemple

var intentTags = [
        {
            desc: 'elenca numeri telefonici',
            type: 'numero',
            phrases: ['numero', 'numeri'],
            regex: new RegExp( /(?<!\w)(nu?m?e?r?[oi]?)\b/, 'i' )
        },
    ]
    
     var val = "numeri"

    var result1 = intentTags[0].regex.test( val );
    var result2 = intentTags[0].regex.test( val );
    var result3 = intentTags[0].regex.test( val );
    var result4 = intentTags[0].regex.test( val );
    var result5 = intentTags[0].regex.test( val );
    var result6 = intentTags[0].regex.test( val );

    console.log( val, "returns: ", result1, result2, result3, result4, result5, result6 );
Federico klez Culloca
  • 26,308
  • 17
  • 56
  • 95
eborrallo
  • 750
  • 1
  • 8
  • 17