Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: Regular Expression - Need HElp..pls

by GhodMode (Pilgrim)
on Jan 31, 2006 at 17:14 UTC ( [id://526806]=note: print w/replies, xml ) Need Help??


in reply to Regular Expression - Need HElp..pls

/^[\w\d][\w\d-]*$/
  • beginning of the string
  • followed by a single word or digit character
  • followed by 0 or more word, digit, or dash characters
  • followed by the end of the string
--
-- GhodMode

Replies are listed 'Best First'.
Re^2: Regular Expression - Need HElp..pls
by davido (Cardinal) on Jan 31, 2006 at 17:22 UTC

    '\w' allows the non-alpha character '_' (which is considered by Perl to be a "word" character). It also allows for a trailing '\n' in the string (the \n isn't "matched", but it's permitted by '$'). Since I understood the OP's criteria to not permit any sort of space or special character, the solution is to use '\z' instead of '$'.

    Update: As pointed out by Roy Johnson, \w also matches numeric digits, so the use of \d is redundant.


    Dave

      Dave's exactly right! So, I'll recommend and explain something which combines our methods ...

      /^[:alpha:][[:alpha:]\d-]*\z/

      I favor one-liners, but that's just a style preference. I changed my \w to [:alpha:], my ^ to \A, and my $ to \z per davido's recommendation, but I stuck with the \d because it's shorter and still works in this case. I left off the m at the beginning because that's the default anyway. I left off the x at the end because this regex doesn't use extended patterns (ref: Extended Patterns).

      • \A : Beginning of the string
      • [:alpha:] : One alphabetic character (ref: perlre
      • [[:alpha:]\d-]* : 0 or more characters consisting of alphabetic characters, digits, or dashes
      • \z : The end of the string
      --
      -- GhodMode
      

        Your solution is still wrong as proposed:

        /^[:alpha:][[:alpha:]\d-]*\z/

        The first mistake is that [:alpha:], by itself isn't a character class. It won't compile as you've written it. It needs to be presented like this:

        [[:alpha:]] ^_________^______Note the outer set of brackets.

        The next problem is that the OP stated that the first character cannot be a hyphen character, but he didn't exclude numeric digits. Your solution will fail if the first character is a numeric digit.

        Also, '^' matches at the beginning of a "line". That probably isn't an issue for this particular regexp, but it is worth noting that '^' is different from '\A', which matches at the beginning of a string.

        If you really despise the /x modifier, and prefer to avoid [:digit:] for whatever reason (maybe less typing?), you could rewrite my original solution like this:

        m/\A[[:alpha:]\d][[:alpha:]\d-]*\z/

        But I think the version with the /x modifier is easier to read since it keeps individual anchors together, and everything else separate.


        Dave

Re^2: Regular Expression - Need HElp..pls
by dani_cv_perl (Initiate) on Jan 31, 2006 at 17:45 UTC
    Thanks.. a lot....

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (3)
As of 2024-03-30 00:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found