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

P

PerlFAQ Server

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.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,821
Messages
2,569,748
Members
45,726
Latest member
RaleighAll

Latest Threads

Top