Regular Expression Recipes 258
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.
Curious (Score:3, Funny)
"Regex coders are in league with the devil"
Who woulda thunk it!
Re:Curious (Score:5, Funny)
It's something called a joke. A joke is something said or done to evoke laughter or amusement, especially an amusing story with a punch line. Jokes employ something called humor. Humor is the quality that makes something laughable or amusing. Many Slashdotters are unable to perceive, enjoy, or express what is amusing, comical, incongruous, or absurd, often referred to as humor impaired.
Re:Curious (Score:2)
Just admit you're a robot and your life should go much smoother from now on.
And not an amusing robot like Bender, or HAL.
Re:Curious (Score:3, Funny)
You should try tweaking your
Points (Score:5, Informative)
1. the binding broke
2. the index has a lot of typos.
Re:Points (Score:2, Funny)
No problem, the website issued a global regex and a pot of tip-ex for all customers.
Typical... (Score:2)
Re:Typical... (Score:2)
You may be right, but its my experience that tech books are surprisingly reasonable in price. My average textbook in any other field costs >$100, and my tech books are usually in the $40 range. Of course, this could just be that there's less demand for "Financial Accounting" than my PHP or Java books. Dunno, just my experience.
Re:Typical... (Score:4, Insightful)
Re:Points (Score:3, Funny)
Yeah, but in a book about regexes, you have to study the index VERY CAREFULLY to determine whether there are any typos or not.
Bran... (Score:3, Funny)
Another one? (Score:2, Insightful)
Re:Another one? (Score:2)
A cookbook approach to Regexs seems great to me. Look up the one
Try them out (Score:5, Insightful)
http://www.dedasys.com/freesoftware/applications.
Perhaps other people can recommend other tools they've found useful for learning/building regular expressions.
Re:Try them out (Score:4, Interesting)
Re:Another one? (Score:2)
Re:Another one? (Score:4, Informative)
Regular expressions in a cookbook? (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 [ostermiller.org]. 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 [ostermiller.org]
Re:Regular expressions in a cookbook? (Score:5, Interesting)
It still boggles my mind that people knew this in 1956 though.
Re:Regular expressions in a cookbook? (Score:5, Informative)
Re:Regular expressions in a cookbook? (Score:4, Insightful)
I personally treat this like I do Perl5 threads... as something to be afraid of, and hopeful that things will be much improved in Perl 6.
Re:Regular expressions in a cookbook? (Score:3, Interesting)
Re:Regular expressions in a cookbook? (Score:3, Interesting)
Write your regex's so that they generalize as little as possible.
For example, matching an xml tag use
If you're using ".*?" in a regex, you might want to look at rewriting it.. it's almost never needed and almost always causes problems.
Re:Regular expressions in a cookbook? (Score:3, Interesting)
The examples I gave are:
Re:Regular expressions in a cookbook? (Score:2)
ignorance is bliss (Score:3, Informative)
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...
Re:ignorance is bliss (Score:3, Informative)
Script tags cannot be nested which makes that portion of html able to be matched by a regular expression.
--
Currency conversion calculator [ostermiller.org]
BTW, thanks Stephen (Score:2)
Re:Regular expressions in a cookbook? (Score:3, 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 [ostermiller.org]
REGEX (Score:5, Funny)
I'm not sure I understand what your quibble is - do you dislike the fact that he uses non-capturing groups, or the fact that he disposes of them at certain points?
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.
This seems like a relatively novice mistake, and I'm surprised it would show up in a book on regular expressions.
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.
It's nice that he covers five environments for regular expressions. I'm sure everyone has heard of Mastering Regular Expressions [oreilly.com], published by O'Reilly. The Perl Cookbook [oreilly.com] also does a good job at solving common problems with Regular expressions.
This is just my opinion, but I think what the world needs is a book on Regular Expression Design Patterns.
Unacceptable mistakes (Score:5, Interesting)
How can this be a good book when it makes such mistakes? If this book is for beginners (as it seems) the editing process should have been much better.
Re:Unacceptable mistakes (Score:2)
(Just to be pedantic.)
Re:Unacceptable mistakes (Score:3, Informative)
Re:Unacceptable mistakes (Score:2)
(I kid, I kid.)
Re:Unacceptable mistakes (Score:2)
How can this be a good book when it makes such mistakes? If this book is for beginners (as it seems) the editing process should have been much better.
I guess the author was a novice and used Word to type the book. Word is notorious of automiscorrecting technical documents.
Re:Unacceptable mistakes (Score:3, Insightful)
Re:Unacceptable mistakes (Score:3, Informative)
Re:Unacceptable mistakes (Score:2)
Though I would use [A-Za-z0-9_] just to be on the safe side.
Re:Unacceptable mistakes (Score:2)
Re:Unacceptable mistakes (Score:2)
The correct way is '[A-Za-z]'.
Re:Unacceptable mistakes (Score:2)
BTW. regular expressions present a complete Turing machine. [A-z] is wrong due to implementation of the expressions engine. They are most likely implemented in a way, that uses character 'A' as x41. Since 'Z' is x5A and 'a' is x61 there is a gap in there that would include a bunch of other characters.
Re:Unacceptable mistakes (Score:4, Interesting)
Actually no: regular expressions are a great example of a language which is not Turing complete, but is useful nonetheless.
The classic limitation of regexes is that you can't use them to parse arbitrarily nested brackets -- because there is no concept of a stack. A Turing machine would be able to do this.
(Researching this post [yes! researching!] I found a couple of mailing list posts from various peoplel suggesting that Perl regexes are Turing complete. If this is true [which I have not established], it's because Perl extends the concept of REs in various ways)
Re:Unacceptable mistakes (Score:2)
Re:Unacceptable mistakes (Score:2)
Because there are some characters between the letters Z and a in ASCII.
what's the correct way to do it?
[A-Za-z] - for us-ascii, or
[:alpha:] - for other charsets, if your system supports it.
Re:jeez (Score:2)
Re:jeez (Score:2)
Re:Unacceptable mistakes (Score:2, Informative)
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.
Minor variations (Score:5, Funny)
I can relate. I have cookbooks for food that have all these recipes that are nothing but flour, butter, eggs, and sugar. Do we need all these recipes for pancakes, cupcakes, cookies, crepes, waffles, popovers, bread, quick bread, bread sticks? Won't people figure out eventually to put a little less sugar in waffles with savory ingredients?
Japanese cookbooks are even worse. Soy sauce, sake, mirin...boooooooring!
Re:Minor variations (Score:2)
If you think there's only a minor variation between cookies and bread, let me adopt you. You'll be the easiest kid ever to take care of.
Yum, peanut butter and jelly cookies'mich.
Re:Minor variations (Score:2)
2) sourdough starter technique
3) poolish technique
4) pumpernickel
5) ok, I can only think of 4 offhand
Re:Minor variations (Score:2)
I personally... (Score:5, Informative)
Re:I personally... (Score:3, Informative)
I'm one of the few people who doesn't like Friedl's
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
catastro
add this book to your list (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 [amazon.com] 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.
Re:add this book to your list (Score:2)
two problems (Score:4, Funny)
Jamie Zawinski
Re:two problems (Score:2)
Linda Richmond says... (Score:5, Funny)
I'm feeling a bit verklempt!
Talk amongst yourselves!
Alright, I'll give you a tawpic:
"Regular Expressions are neither regular nor expressions."
Discuss.
a Cookbook eh? (Score:3, Funny)
Regexes are overused (Score:5, Informative)
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.
Re:Regexes are overused (Score:2, Informative)
For some sort of system that processes umpteen billion transactions per second, they can be a godsend. For parsing a
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
Re:Regexes are overused (Score:2)
Re:Regexes are overused (Score:4, Insightful)
I see many people trying to use regexes to do parsing, when they should be using a specialized parser.
Re:Regexes are overused (Score:3, Informative)
You get tokenizer, regex, and a parser library (spirit), in sorted by increasing caliber.
It's all about the right tool for the job.
Re:Regexes are overused (Score:4, Funny)
I think that's a sure sign of insanity. Or autism at the least.
Re:Regexes are overused (Score:2)
If you're searching for occasions of something or other in a long document, grep is obviously going to be an easy way (with regex's), but if you want to extract the hostname from a URI, just code it.
Re:Regexes are overused (Score:3, Insightful)
That's not quite fair. That regex validates any RFC822 address, and the syntax allowed isn't simple. Validating things that are currently used is fairly easy, but there's a lot of historical baggage in RFC822 addressing.
Re:Regexes are overused (Score:4, Insightful)
That's insane. My feelings on Regexes were set early in my career. I discovered them, and like many started using them everywhere. Then in a code review, my boss pointed to one particularly complex one and said "See, there's why you shouldn't try to do such complex things with regular expressions, this one has a bug" "Where?" says me. "Let's leave that as an exercise for the student. Come ask me if you can't figure it out in an hour or so." Well, I certainly wasn't going to admit defeat, even though it took me several hours to find the rather subtle problem. So I went back and demanded to know how he had spotted it so fast. And he said "I didn't. It was a regex 3 lines long. It had to have a bug."
Regex Coach helps building Regexp (Score:5, Informative)
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.
Re:Regex Coach helps building Regexp (Score:2, Informative)
ambiguous use of "they/them" (Score:2)
"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\) \1 can be an arcane hodgepodge of odd characters that somehow manage to do wonderful things, but \2 don't have enough time (or interest) to really understand how to code \1."
Different flavors? (Score:4, Informative)
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.
Re:Different flavors? (Score:2)
Er, well, not exactly. grep, extended (egrep) and fixed (fgrep) allow for different feature/speed tradeoffs, but they are consistent in their use of regular expressions. Where you will find differences is between the regex syntax of vi, perl, sed, grep, etc.
After ten+ years, I still consult a reference for all the escape codes and such. Used to be a book, now it's google.
HTML, XML, CSV, but why? (Score:4, Interesting)
Free Alternative (Score:4, Informative)
http://www.regexlib.com/ [regexlib.com]
About 279 pages too long (Score:4, Insightful)
My very favorite recipe book is a tiny little thing of about 40 pages. For each kind of meat and each kind of vegetable, it lists what spices and sauces go well with it, how long and how hot to cook it, and how to tell when it is done. There is a little section on how to make about a dozen differnet sauces. That's it.
A programming language has syntax and semantics. For regular expressions, Chomsky gave both fully in his original paper on the subject. The added conveniences that some utilities provide are all listed in their respective man pages. The entire subject, if it were collected together, should be about 10 pages. With some explanation of language theory, grammars, and such, the whole might be worth a chapter. Get out an undergraduate compiler-theory book (such as Aho/Sethi/Ullman). They have less than a chapter on regular expressions, and they cover the topic fairly well.
But, I suppose, there is a difference between a cookbook that is made for cooks to use as a reference, and a cookbook that is made for non-cooks to follow by rote. Learn how to cook. You will be surprised how seldom you actually refer to the 1000+ page cookbooks.
Re:About 279 pages too long (Score:2)
Re:About 279 pages too long (Score:2)
In one ear, out the other (Score:2)
check out regex coach if you want to learn (Score:2, Interesting)
http://www.weitz.de/regex-coach/ [weitz.de]
Separating the men from the boys... (Score:2)
Use more than regular expressions (Score:2)
With that, I almost always use anchoring via ^ or $.
:help pattern (Score:4, Informative)
Of course, if you use the one true text editor [vim.org], all you need to know about regular expressions is:
:)
Re:Email RegEx (Score:2)
(I would post one here, but the lameness filter hates it, so I'll just link to it [regexlib.com]).
Covers RFC 8288, as well as IP addresses.
Re:Email RegEx (Score:3, Interesting)
Well, you asked for it [ex-parrot.com].
Actually, I asked for it last week, in #linux on freenode. Scary huh?
Re:Email RegEx (Score:2)
Re:Email RegEx (Score:2)
Re:Email RegEx (Score:2)
Re:A language in their own right. (Score:2, Informative)
Re:A language in their own right. (Score:2, Informative)
Re:A language in their own right. (Score:4, Informative)
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.
Re:cant get used to them (Score:2, Informative)
I have a suggestion. Write a few regular expressions to get your brain refreshed on them, then go read this excellent article [plover.com] 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 re
Re:cant get used to them (Score:4, Informative)
Re:cant get used to them (Score:2, Informative)
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.
Re:cant get used to them (Score:4, Informative)
Re:Regexes How2 (Score:5, Informative)
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.
Re:cant get used to them (Score:2)
I get excel files dumped to me for inserts into Oracle databases...some are HELL to clean up. Especially the comma delimited ones..with freeform text fields...that allow the user to put hard returns in them....
That and one more bitch. When did MS make it so damned hard to change the delimiter in excel?? I remember a few editions ago, when you saved as a CSV, it gave you a wizard type thing to choose
Re:F*ck this book and all others like it: (Score:2)
I somehow think that a lot of /.'ers will find an analogy of .NET to pigeon shit as quite apropos. :)
Re:F*ck this book and all others like it: (Score:2, Funny)
You dumb slashbot fucks have no idea what a regex is [...]
Sycophants and asshats, monkeys who crawl around above my office trying to figure out which wire the rats chewed through. Know-nothing idiots [...]
Fuck you and your iPods. All those white earbuds do is help me pick out the clueless wannabes. No true geek would own one.
Let me guess... you didn't finish the Dale Carnegie course, did you?
Re:F*ck this book and all others like it: (Score:2)
I got a laugh out of hsi/her comments, if that counts for anything.
And I found the iPod comment very insightful...