Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: Quick Regex Question

by Athanasius (Monsignor)
on Oct 08, 2012 at 14:24 UTC ( #997823=note: print w/ replies, xml ) Need Help??


in reply to Quick Regex Question

0:20 >perl -E "my $line = qq[asdf asdf asdf INC1234567 klasdv asf asd +f ]; if ($line =~ /INC\d{7}/ ) { say qq[yes]; } else { say qq[no]; }" yes

Your only mistake was in backslashing the curly brackets.

Update: Fixed typo: the second occurrence of $line was missing the sigil.

Athanasius <°(((><contra mundum


Comment on Re: Quick Regex Question
Download Code
Re^2: Quick Regex Question
by Anonymous Monk on Oct 08, 2012 at 14:31 UTC
    Thank you for the quick reply. I must be doing something wrong as now it matches 7,8,9,10, etc numbers. I am looking to only match exactly 7?

      OK, change the regex to:

      /INC\d{7}(?:[^\d]|$)/

      which should match only exactly 7 digits. (INC followed by 7 digits followed by either a non-digit or the end of the string.)

      Update: Better solutions:

      /INC\d{7}(?!\d)/

      using a zero-width negative look-ahead assertion; or:

      /INC\d{7}(?:(?=\D)|$)/ # Corrected: See post by AnomalousMonk, belo +w.

      using a zero-width positive look-ahead assertion together with \D as per GrandFather’s suggestion. See Extended Patterns.

      Athanasius <°(((><contra mundum

        You can use \D for "not a digit". In like fashion you can use \W and \S to complement the common word and space matches.

        True laziness is hard work
        ... using a zero-width negative look-ahead assertion; or ... using a z +ero-width positive look-ahead assertion together with \D ...

        Note that  (?!\d) and  (?=\D) are not complementaryequivalent. The  (?!\d) assertion is satisfied by having any non-digit follow it or by nothing, i.e., by the end of the string, nothing being not-a-digit. The  (?=\D) assertion must be followed by a non-digit character. And similarly with the  (?<!\d) and  (?<=\D) look-behinds.

        >perl -wMstrict -le "my $s = 'xyzINC1234567'; ;; print 'negative assertion true' if $s =~ /INC\d{7}(?!\d)/; print 'positive assertion true' if $s =~ /INC\d{7}(?=\D)/; " negative assertion true

        In this behavior,  (?!\d) and, in general,  (?!character-or-character-class) and its negative look-behind cousin are similar to (but not exactly the same as) the  \b assertion, which may be true at the beginning or end of a string.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://997823]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (6)
As of 2014-09-21 19:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (175 votes), past polls