Mastering Regular Expressions, 2nd Edition by Jeffrey E. F. Friedl The following errata were *corrected* in the 11/02 reprint: Here's a key to the markup: [page-number]: serious technical mistake {page-number}: minor technical mistake : important language/formatting problem (page-number): language change or minor formatting problem p66, IN PRINT: last sentence of answer box; "They end up incorrectly replacing JEFFS with Jeff's and JEFF's, respectively. " NOW READS: "They end up incorrectly replacing JEFFS with Jeff's and Jeff'S, respectively. " p66, IN PRINT: 2nd line below mid-page table; "and it compliment ... " NOW READS: "and its complement ... " p74, IN PRINT: O'Reilly url near the bottom of the page; "http://www.oreilly.com/catalog/9780596002893/. " NOW READS: "http://www.oreilly.com/catalog/9780596002893/ " p74, IN PRINT: line after O'Reilly url; "Using at the end \b would disallow... " NOW READS:: "Using \b at the end would disallow... " p137, IN PRINT: middle of page; "...is available via \k with .NET, and (?P=Month) in Python. " NOW READS: "...is available via \k with .NET, and (?P=Area) in Python. " p162, last sentence ..., there are a dozen saved states... NOW READS: ..., there are 13 saved states... p163, first sentence ...governed dot matching 12 things that are... NOW READS: ...governed dot matching 13 things that are... p164, end of 2nd paragraph in sidebar ...in the regex after the [0-9]*] that kept... NOW READS: ...in the regex after the [0-9]* that kept... p169, paragraph above the header We know that .* with the greedy... NOW READS: We know that ".*" with the greedy... p174, third line of last paragraph ...checked in the right-to-left order given... NOW READS: ...checked in the left-to-right order given... p191, code snippet $WholePath =~ m{ ([^/]*)$ }; NOW READS: $WholePath =~ m{([^/]*)$}; p196, last paragraph before the heading As I mentioned earlier, the "match anything not the closing delimiter" can become complicated when the closing delimiter is more than one character, or in situations where it can appear within the main text. NOW READS: As I mentioned earlier, satisfying these requirements can become complicated when the closing delimiter has more than one character, or when it may appear within the main text. p205, first line, and both code snippets In each of the hostname regexes, the final [-a-z0-9] NOW READS [a-z0-9] This change carries over to pp304 and 306 as well p205, both code snippets (?:i) # apply this regex in a case-insensitive manner. NOW READS: (?i) # apply this regex in a case-insensitive manner. p208, end of code snippet At the end of the code snippet, the two long character classes: [^;"'<>()\[\]{}\s\x7F-\xFF] were missing four characters. These character classes NOW READ: [^!.,?;"'<>()\[\]{}\s\x7F-\xFF] Also, the short class before the final long one, [.,?]+, was missing an exclamation point. It NOW READS [!.,?]+. p233, code snippet while (--$Count > 0) { NOW READS: while ($Count-- > 0) { p233, last paragraph So, with this test case, one is about 11W faster than the other. NOW READS: So, with this test case, one is about 22W faster than the other. p250, first heading Exponential (a.k.a, super-liner) short-circuiting NOW READS: Exponential (a.k.a, super-linear) short-circuiting p251, sidebar, end of first paragraph ... or possessive quantifiers, ^\w++>: NOW READS: ... or possessive quantifiers, ^\w++: p257, second-to-last line .., the negative lookahead (underlined for clarity)... NOW READS: .., the positive lookbehind (underlined for clarity)... p278, second line beginning, any point you that the text is: NOW READS: beginning, any point in the text that you start at is: p278, toward the bottom to removeC++ /Java/C# style: NOW READS: to remove C++/Java/C# style: p285, mid-left of the table use charnames 'full'; NOW READS: use charnames ':full'; p288, second paragraph of 5th bullet \p{UNASSIGNED NOW READS: \p{UNASSIGNED} p288, first line after heading The final items in Table 7-1 are marked ... NOW READS: The final items in Table 7-2 are marked ... p303, third line below mid-page heading ... substitution, or spilt, or ... NOW READS: ... substitution, or split, or ... p304, mid-page code snippet In the hostname regex, the final [-a-z0-9] NOW READS [a-z0-9] This correction carries over from p205, and to p306 as well p304, last paragraph The two occurrences of $WordObject NOW READ $WordRegex. p306, code snippet In the hostname regex, the final [-a-z0-9]NOW READS [a-z0-9] . This correction carries over from pp205 and 304 p308, last code snippet # Copy $text to $result... NOW READS: # Copy $text to $copy... p327, first line of third paragraph This simple example ^(\d)(??{ "X{$1}" })$ is shown... NOW READS: This simple example ^(\d+)(??{ "X{$1}" })$ is shown... p335, first line Here's a simple example that uses finds ... NOW READS: Here's a simple example that finds ... p337, second-to-last paragraph of sidebar The \s+ is needed because... NOW READS: The \s* is needed because... p406, first header Backlash-digit ambiguities NOW READS: Backslash-digit ambiguities