6 Replies Latest reply on Feb 18, 2012 2:00 PM by Muppet Mark

    Javascript RegExp bug?

    TᴀW Adobe Community Professional & MVP

      Hi,

       

      I'm sending this via email (no Internet access right now) so I hope it

      comes through properly

       

       

      In the ExtendScript console, try this:

       

      "hello".match(/[a-z]+/)

       

      The output is

       

      hello

       

      which is correct

       

      But if you try this:

       

      "hello".match(/[f-z]+/)

       

      the output is only

       

      h

       

      which is not what I would have expected. Shouldn't + match all

      characters that are within the range f-z?

       

      Can anyone help me understand this, or is it in fact a bug?

       

      Thanks,

      Ariel

       

        • 1. Re: Javascript RegExp bug?
          John Hawkinson Level 5

          Ariel:

           

          Some portion of your post was misformatted, because Jive turns square brackets into hyperlinks, but I don't think we lost anything.

           

          This behavior is unambiguously correct. [f-z] matches a single character in the class, and + tells it to match one or more of the previous, in a contiguous block. Since 'h' matches and 'e' does not, it stops with 'h'.

           

          You haven't told us what you expected, or what you are trying to achieve, so it's a bit tough to give you the answer you're looking for.

           

          If you are expecting to return the non-contiguous set of characters in the string that match a class, then regexps don't really work that way. You could, I suppose, replace all characters in the inverted class [^f-z] with the null string, which would have a similar effect. i.e. "hello".replace(/[^f-z]/g,"");

          • 2. Re: Javascript RegExp bug?
            Marijan Tompa [tomaxxi] Level 4

            John Hawkinson wrote:

             

            If you are expecting to return the non-contiguous set of characters in the string that match a class, then regexps don't really work that way. You could, I suppose, replace all characters in the inverted class [^f-z] with the null string, which would have a similar effect. i.e. "hello".replace(/[^f-z]/g,"");

             

            Or simplier: "hello".match(/[f-z]+/g).join("");

            • 3. Re: Javascript RegExp bug?
              [Jongware] Most Valuable Participant

              John Hawkinson wrote:

              This behavior is unambiguously correct. [f-z] matches a single character in the class, and + tells it to match one or more of the previous, in a contiguous block. Since 'h' matches and 'e' does not, it stops with 'h'.

               

               

              It does work correct, as this

               

              "hello".match(/[f-z]+/g)

               

              returns two strings: "h,llo" -- exactly as specified in that range

              • 4. Re: Javascript RegExp bug?
                TᴀW Adobe Community Professional & MVP

                Hi Marijan -- After reading John's post, that's what I thought of as well.

                 

                Thanks,

                Ariel

                • 5. Re: Javascript RegExp bug?
                  TᴀW Adobe Community Professional & MVP

                  Hi John,

                   

                  Thanks for your response. Sorry for the formatting problems, but I think

                  you did indeed decipher what came through correctly!

                   

                  I forgot that replace will only return a contiguous block. Now I

                  remember that I've got to use arrays.

                   

                  What I was hoping was to extract from a given string only the letters I

                  want: from "hello" everything but the e, for instance: "hllo"

                   

                  Your inverted idea should work, and also using a "g" tag at the end like

                  you do, with a join("") should do the trick.

                   

                  Thanks for your help. I'll try and remember to mark the answer as

                  correct when I have the chance.

                   

                  Ariel

                  • 6. Re: Javascript RegExp bug?
                    Muppet Mark Level 5

                    Then use the g global as jong did… join the result