Slashdot Mirror


Regular Expression Recipes

r3lody writes "If you spend time working writing applications that have to do pattern matches and/or replacements, you know about some of the intricacies of regular expressions. For many people they can be an arcane hodgepodge of odd characters that somehow manage to do wonderful things, but they don't have enough time (or interest) to really understand how to code them. Nathan A. Good has written Regular Expression Recipes: A Problem-Solution Approach for those people. In its relatively slim 289 pages, he offers 100 regular expressions in a cookbook format, tailored to solve problems in one of six broad categories (Words and Text, URLs and Paths, CSV and Tab-Delimited Files, Formatting and Validating, HTML and XML, and Coding and Using Commands)." Read on for the rest of Lodato's review. Regular Expression Recipes: A Problem-Solution Approach author Nathan A. Good pages 289 publisher Apress rating 8/10 reviewer Raymond Lodato (rlodato AT yahoo DOT com) ISBN 159059441X summary A cookbook of useful regular expressions for Perl, Python and more.

Regular expressions are not restricted to just the Perl or shell environments, so Nathan offers variations for Python, PHP, and VIM as well. In most cases the translation is relatively straight-forward, but in a few cases a different environment may have (or lack) additional facilities, prompting a different expression to do the same task.

Before you even read chapter 1, Nathan provides a quick summary course on regular expressions, with detail given to each of the five environments you might utilize. He has written the syntax overview in a highly-readable format, making it easy to understand the gobbledy-gook of the most bizarre concoctions you might encounter.

The first chapter (Words and Text) starts simply enough. He gives examples of how to find single words, multiple words, and repeated words, along with examples of how to replace various detected strings with others. In each case he gives an example of its use for each platform, followed by a bit-by-bit breakdown of how it works. Not every environment is given on every example, and in many cases the "How It Works" section refers to the first one, as most REs are identical between the platforms.

The next chapter (URLs and Paths) offers various methods of doing commonly needed parsing. Pulling out file names, query strings, and directories, as well as reconstructing them in useful fashions is covered in the 15 offerings given here. Validating, converting, and extracting fields of CSV and tab-delimited files are handled in chapter 3, while chapter 4 is concerned with validating field formats, as well as re-formatting text for the fields. Chapter 5 handles similar tasks for HTML and XML documents. The final chapter covers expressions that facilitate the management of program code, log files, and the output of selected commands.

First, I must admit that there are a number of useful solutions provided, especially for someone who is concerned with application and web development. However, I did feel a little cheated by the fact that several chapters covered essentially the same task, with only minor variations. It almost seemed as though the author was trying to pad out the solution count to the magic number 100. A simple example: three solutions in chapter one cover (a) replacing smart quotes with straight quotes, (b) replacing copyright symbols with the (c) tri-graph, and (c) replacing trademark symbols with the (tm) sequence. In each case, the expression was simply "s/\xhh/ rep /g;". Did we really need three separate chapters for that? I don't think so.

Another quibble revolves around some of the coding of the expressions. Nathan has made liberal use of the non-capturing groups (that is, (: expr )) to insure only the items that needed replacement were captured. While a worthy idea, in some cases the expression may have been simplified for understanding. Another issue is a slight error in searching for letters. In a number of expressions, Nathan uses [A-z] to capture all letters. Unfortunately, the special characters [, \, ], ^, _, and ` occur between upper-case Z and lower-case a, making it match too much. Either [[:alpha:]] or [A-Za-z] should have been used.

Despite these quibbles, Regular Expression Recipes does provide a useful compendium of solutions for common problems developers face. Presenting the information in a cookbook fashion, along with ensuring that those using something other than Perl don't have to sweat translating the expressions to their target language, makes this a handy book to have. I wouldn't hesitate to recommend it.

You can purchase Regular Expression Recipes: A Problem-Solution Approach from bn.com. Slashdot welcomes readers' book reviews -- to see your own review here, read the book review guidelines, then visit the submission page.

31 of 258 comments (clear)

  1. cant get used to them by alienfluid · · Score: 1, Informative

    regular expressions are nice and all but i still cant get used to them .. a good manual should be kept handy at all times. Vist Lafayette Linux Users Group at http://lug.lafayette.edu. Suggestions are welcome.

    1. Re:cant get used to them by Anonymous Coward · · Score: 2, Informative
      regular expressions are nice and all but i still cant get used to them .. a good manual should be kept handy at all times. [ ... ]
      Suggestions are welcome.

      I have a suggestion. Write a few regular expressions to get your brain refreshed on them, then go read this excellent article on how regular expressions work. At the very least, it will clear some confusing things up. Most likely you'll find that having a better understanding of the underlying concepts will make it easier for you to work with regular expressions day to day.

      Also, it helps if you are familiar with finite state machines. I learned about them in a couple classes while getting my CS degree, but they're not that hard and most people should be able to grasp them without any kind of formal CS training.

    2. Re:cant get used to them by Waffle+Iron · · Score: 2, Informative
      regular expressions are nice and all but i still cant get used to them

      They may be kind of hard to get used to, but not has hard as writing, debugging and maintaining a dozen or more lines of custom string parsing code for each case where you would use one.

    3. Re:cant get used to them by halber_mensch · · Score: 4, Informative

      A good starting point is to understand finite automata and regular languages first. See http://en.wikipedia.org/wiki/Automata_theory/ for a good first reference on automata. If you can grok automata, regular expressions will click with you.

      --
      perl -e "eval pack(q{H*},join q{},qw{70 72696e74207061636b28717b482a7d2c717b343 637323635363534323533343430617d293b})"
    4. Re:cant get used to them by B'Trey · · Score: 3, Informative

      If you really want to understand regexes, get Jeffrey E. E. Friedl's "Mastering Regular Expressions" from O'Reilly. It's much deeper than the casaul reader will ever need, but if you get through it you will certainly know how regexes work from both a user perspective and from a regex engine perspective.

      --

      "The legitimate powers of government extend only to such acts as are injurious to others." Thomas Jefferson.

  2. Points by 2.7182 · · Score: 4, Informative

    I really liked this book, but

    1. the binding broke
    2. the index has a lot of typos.

  3. Regular expressions in a cookbook? by DeadSea · · Score: 5, Informative

    Sounds like good eating. ;-)

    Regular expressions are great, but once you know them and you think you can conquer the world, I find they occasionally let you down. The text editor I was using had a rudementary regular expression search that did not support non-greedy matching. I found that writing a regular expression that finds C style /* comments */ to be quite tricky with only greeding matching. I wrote it up as an article where I build the expression piece by piece showing common things you might try that won't work.

    If you want more of a challenge, try writing a regular expression that find any <script></script> tags along with anything in between using only greedy matching. You will find that the length of your regular expression goes up exponentially with the length of your ending condition.

    --
    Calculator for Converting Currency

    1. Re:Regular expressions in a cookbook? by merlyn · · Score: 5, Informative
      Yup, regular expressions are not capable of a full-range of computing
      That's the "classic" regular expressions, not the modern regular expressions accepted by PCRE, and Perl itself. In fact, Perl regular expressions are full Turing machines, with PCRE being a few steps behind that. So PCRE isn't really PCRE... it's P-likeCRE. {grin}
    2. Re:Regular expressions in a cookbook? by DeadSea · · Score: 2, Informative

      Your expression fails for this case:

      <script><scri</script>

      It will match <scri< with your |</scri[^p] rule and then go on to match beyond the end of your regular expression.

      But I acknowledge that it may be quadratic rather than exponenetial even with a correct regular expression.

      --
      Exchange Rate Calculator

  4. I personally... by BlueCodeWarrior · · Score: 5, Informative

    ...use 'Mastering Regular Expressions . It's a good book on the topic as well.

    1. Re:I personally... by Bryson · · Score: 3, Informative

      > use 'Mastering Regular Expressions . It's a good book on the topic as well.

      I'm one of the few people who doesn't like Friedl's /Mastering
      Regular Expressions/. (I have the first edition.)

      First, he says that extended regexp engines, such as Perl's, use
      nondeterministic finite automata (NFA). Not true; NFA's can
      accept exactly the same languages as DFA's (deterministic finite
      automata). The extended regexps use search-and-backtrack
      engines.

      Friedl gives some examples of (extended) regexps that have
      catastrophic worst-case behavior, but doesn't present a
      systematic method for recognizing or avoiding them. The naive
      use of extended regexps, mostly by people who think they have
      mastered them, is setting us up for denial-of-service attacks
      based on the worst-case complexity of regular expressions.

      Formal regular expressions are exactly the languages DFA's and
      NFA's can accept. A DFA can parse any string in time
      proportional to the length of the string. Compiling the DFA may
      be exponential time, and space, but at least we find out at
      compile time, not when some attacker figures out a case we
      missed.

  5. add this book to your list by yagu · · Score: 3, Informative

    While I can't vouch for the quality of the reviewed book,if you want something definitive on regular expressions, Mastering Regular Expressions, Second Edition by Jeffrey E. F. Friedl is an absolute must for your professional library. Jeffrey breaks down and then builds back up what regular expressions are and how they work, and offers an entire matrix breakout of the slightly different implementations among the most common utilities (grep, sed, awk, perl...). Not to shill for amazon, but if you select the reviewed book, the "buy this book too, and you get this great price" deal actually includes the Mastering Regular Expressions, Second Edition. . Get 'em both, you won't be sorry.

  6. Re:A language in their own right. by APDent · · Score: 1, Informative

    Regular expressions are not Turing complete.

  7. Re:A language in their own right. by smoany · · Score: 2, Informative

    Um, last time I checked, Reg. Exp's are not turing complete. Take the expression O^n 1^n, which can be made by Turing machines. If you can make that for me using a Regular Expression, you deserve a Turing Award. Regular expressions are DFA/NFA complete, not turing complete... not even close!

  8. Re:A language in their own right. by khrtt · · Score: 3, Informative

    Regular expressions are probably the first Turing-complete language to be encapsulated in another Turing-complete language (C).

    Don't you just love to sound like a StarTrek character, with all that fancy terminology?

    Go look up your complexity book - if you have one - regexes are not even close to Turing-complete.

  9. Re:Unacceptable mistakes by hattmoward · · Score: 2, Informative

    \w is [A-Za-z0-9_]. The reviewer mentions use of the POSIX character class [[:alpha:]], which is more in line with what you want, and will (is supposed to) match alpha characters in non-ASCII character sets.

  10. Regexes are overused by ryantate · · Score: 5, Informative

    Anyone who drops in regularly on a Perl discussion forum (like perlmonks.org) knows that programmers tend to over-use regular expressions.

    Regexes are actually a pretty poor way to extract information from comma-delimited or tab-delimited files, for example. By the time you're done dealing with escaped commas, escaped tabs, quoting characters (which many CSV and TDT exporters use in addition to commas and tabs), escaped quote characters, escaped newlines, and escaped escape chars, you end up with a super-complicated regex.

    HTML is even more complicated. You have HTML comments and nested tags on top of everything else.

    To validate a simple email address, Jeffrey Friedl in his Mastering Regular Expressions book for O'Reilly writes an *11-page* regex.

    Most of the time the correct answer is not "here is a regex recipe" but rather "here is a simple library to do the job property with a parser", like Text::CSV or HTML::Parser in perl.

    1. Re:Regexes are overused by stratjakt · · Score: 2, Informative

      Of course, the compiled regex will likely be faster than any parsing library you write. So it all depends what you're doing.

      For some sort of system that processes umpteen billion transactions per second, they can be a godsend. For parsing a .conf file once every six months when the machine is rebooted, it's a waste of time.

      It's all about knowing how and when to use the tool. A pneumatic nailgun can save a carpenter hours on a jobsite, but it's a waste of time to set it all up if you only need to knock in one nailhead that's popped through the drywall.

      --
      I don't need no instructions to know how to rock!!!!
    2. Re:Regexes are overused by smittyoneeach · · Score: 2, Informative

      Consider the boost libraries http://boost.org/.

      You get tokenizer, regex, and a parser library (spirit), in sorted by increasing caliber.

      It's all about the right tool for the job.

      --
      Get thee glass eyes, and, like a scurvy politician, seem to see things thou dost not.--King Lear
  11. F*ck this book and all others like it: by stratjakt · · Score: 1, Informative

    All you need is regexlib.com and a copy of Regulator (I believe thats the free as in beer one) that will break out a regex into english steps like "capture (" "capture 3 or more 0's", and so on.. .NET has a regex facility that's slicker than greased pigeon shit, so I've been making heavy use of it lately.

    --
    I don't need no instructions to know how to rock!!!!
  12. Regex Coach helps building Regexp by uss_valiant · · Score: 5, Informative

    Regex Coach

    This program assists you building regular expressions. I've never used it (real men code regexp at once and it works). But some friends recommend it.

    1. Re:Regex Coach helps building Regexp by DigitalDeviation · · Score: 2, Informative

      Regex Coach is nice for those long regexs that you may have missed an escape somewhere. I write most regexs myself, but I'm no guru at it. Regex Coach is a nice verification that the regex works (particularly for extracting something from a large string).

  13. Different flavors? by dpbsmith · · Score: 3, Informative

    In an average month, I use regular expressions as implemented in Microsoft Visual C++ 6.0, BBEdit Lite, TextWrangler, Apple MPW, and REALBasic. Every single one of them has _significant_ differences in syntax and semantics.

    My understanding is that even the UNIX world sports several different flavors of regular expression in grep, egrep, fgrep, etc.

    The biggest barrier to _my_ use of regular expressions is that every time I switch from one regular expression context to another, it takes me a good half hour to refresh my memory of what does and doesn't work in each environment.

  14. Re:Unacceptable mistakes by Speare · · Score: 2, Informative

    No, [A-z] does not capture all letters. For example, "Å" and "é" are not usually included in the class [A-z], but it is often a part of the class \w.

    --
    [ .sig file not found ]
  15. Free Alternative by MudButt · · Score: 4, Informative

    This is free... And interactive...
    http://www.regexlib.com/

  16. Re:Another one? by carnivore302 · · Score: 3, Informative

    I don't think there is a need for another book on regexps, since there is already the excellent Mastering Regular Expressions by Jeffrey Friedl. What else then the best can you expect from an O'Reilly book?

    --
    Please login to access my lawn
  17. Re:Unacceptable mistakes by LordoftheWoods · · Score: 2, Informative

    the uppercase letters A-Z are followed by a number of special symbols,

    Indeed. If anyone is interested in why ASCII sticks a few characters in there, it's because it allows you to flip a bit to switch between cases.

  18. ignorance is bliss by RelliK · · Score: 2, Informative
    If you want more of a challenge, try writing a regular expression that find any tags along with anything in between using only greedy matching.

    duh! Repeat after me: HTML is not a regular language. There is no regular expression that can match it. The problem arises when people try to use regular expressions without understanding what they are. But, as the saying goes, when the only tool you have is a hammer, everything looks like a nail...

    --
    ___
    If you think big enough, you'll never have to do it.
    1. Re:ignorance is bliss by DeadSea · · Score: 2, Informative
      > duh! Repeat after me: HTML is not a regular language. There is no regular expression that can match it.

      Script tags cannot be nested which makes that portion of html able to be matched by a regular expression.

      --
      Currency conversion calculator

  19. Re:Regexes How2 by softcoder · · Score: 5, Informative

    In addition to a good book, or even INSTEAD of a good book, download and use THE REGEX COACH
    http://www.weitz.de/regex-coach/

    It is a very very nice interactive pgm that lets you debug REGEXES on the fly visually, by feeding them sample text.

  20. :help pattern by digitect · · Score: 3, Informative

    Of course, if you use the one true text editor, all you need to know about regular expressions is:

    :help pattern

    :)

    --
    There is no need to use a SlashDot sig for SEO...