Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: Quick Regex Question

by Athanasius (Abbot)
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
Replies are listed 'Best First'.
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 cooling their heels in the Monastery: (9)
As of 2015-07-08 06:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (96 votes), past polls