FAQ 6.1 How can I hope to use regular expressions without creating illegible and unmaintainable code

Discussion in 'Perl Misc' started by PerlFAQ Server, Feb 25, 2011.

  1. This is an excerpt from the latest version perlfaq6.pod, which
    comes with the standard Perl distribution. These postings aim to
    reduce the number of repeated questions as well as allow the community
    to review and update the answers. The latest version of the complete
    perlfaq is at http://faq.perl.org .

    --------------------------------------------------------------------

    6.1: How can I hope to use regular expressions without creating illegible and unmaintainable code?

    Three techniques can make regular expressions maintainable and
    understandable.

    Comments Outside the Regex
    Describe what you're doing and how you're doing it, using normal
    Perl comments.

    # turn the line into the first word, a colon, and the
    # number of characters on the rest of the line
    s/^(\w+)(.*)/ lc($1) . ":" . length($2) /meg;

    Comments Inside the Regex
    The "/x" modifier causes whitespace to be ignored in a regex pattern
    (except in a character class and a few other places), and also
    allows you to use normal comments there, too. As you can imagine,
    whitespace and comments help a lot.

    "/x" lets you turn this:

    s{<(?:[^>'"]*|".*?"|'.*?')+>}{}gs;

    into this:

    s{ < # opening angle bracket
    (?: # Non-backreffing grouping paren
    [^>'"] * # 0 or more things that are neither > nor ' nor "
    | # or else
    ".*?" # a section between double quotes (stingy match)
    | # or else
    '.*?' # a section between single quotes (stingy match)
    ) + # all occurring one or more times
    > # closing angle bracket

    }{}gsx; # replace with nothing, i.e. delete

    It's still not quite so clear as prose, but it is very useful for
    describing the meaning of each part of the pattern.

    Different Delimiters
    While we normally think of patterns as being delimited with "/"
    characters, they can be delimited by almost any character. perlre
    describes this. For example, the "s///" above uses braces as
    delimiters. Selecting another delimiter can avoid quoting the
    delimiter within the pattern:

    s/\/usr\/local/\/usr\/share/g; # bad delimiter choice
    s#/usr/local#/usr/share#g; # better



    --------------------------------------------------------------------

    The perlfaq-workers, a group of volunteers, maintain the perlfaq. They
    are not necessarily experts in every domain where Perl might show up,
    so please include as much information as possible and relevant in any
    corrections. The perlfaq-workers also don't have access to every
    operating system or platform, so please include relevant details for
    corrections to examples that do not work on particular platforms.
    Working code is greatly appreciated.

    If you'd like to help maintain the perlfaq, see the details in
    perlfaq.pod.
     
    PerlFAQ Server, Feb 25, 2011
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jay Douglas
    Replies:
    0
    Views:
    644
    Jay Douglas
    Aug 15, 2003
  2. RichardOnRails
    Replies:
    7
    Views:
    158
    RichardOnRails
    Apr 5, 2009
  3. PerlFAQ Server
    Replies:
    0
    Views:
    153
    PerlFAQ Server
    Jan 9, 2011
  4. PerlFAQ Server
    Replies:
    0
    Views:
    178
    PerlFAQ Server
    Apr 19, 2011
  5. Noman Shapiro
    Replies:
    0
    Views:
    262
    Noman Shapiro
    Jul 17, 2013
Loading...

Share This Page