FAQ 6.1 How can I hope to use regular expressions without creating illegible and unmaintai...

Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

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

    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:


        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

Site Timeline