Difference between revisions of "Perl regex"

from HTYP, the free directory anyone can edit if they can prove to me that they're not a spambot
Jump to navigation Jump to search
m (→‎Details: more about dot)
(→‎Details: more stuff, and how to match everything-including-newline)
Line 7: Line 7:
 
==Details==
 
==Details==
 
Special characters in regex:
 
Special characters in regex:
* '''.''' = any character except newline (\n) ('''Questions''': is there any special character which represents ''all'' characters? Does [.] also mean any-character-except-newline, or is it interpreted as literal period?)
+
* '''.''' = any character except newline (\n) (if /s option is included, then \n is also matched)
 
* '''*''' = 0 or more of previous character
 
* '''*''' = 0 or more of previous character
 
* '''^''' = following string begins the line (except [^...] means "not these characters")
 
* '''^''' = following string begins the line (except [^...] means "not these characters")
 
* '''$''' = preceding string ends the line
 
* '''$''' = preceding string ends the line
 
* '''[]''' = list of characters which can satisfy the match at this position
 
* '''[]''' = list of characters which can satisfy the match at this position
 +
** Note: cannot use special characters like "." as part of list
 
* '''{}''' = # of repetitions of previous character:
 
* '''{}''' = # of repetitions of previous character:
 
** {<u>x</u>} -> exactly <u>x</u> repetitions
 
** {<u>x</u>} -> exactly <u>x</u> repetitions
Line 25: Line 26:
 
* '''=~''' returns TRUE if pattern matches
 
* '''=~''' returns TRUE if pattern matches
 
* '''!~''' returns FALSE if pattern matches
 
* '''!~''' returns FALSE if pattern matches
 +
* '''m/''' searches a string for a pattern match; returns true/false scalar and an array of matches (if () are used)
 +
** '''c''' don't reset pos on failed matches when using /g
 +
** '''g''' ('''G'''lobal) all occurrences &ndash; repeat the pattern search until there are no more matches
 +
** '''i''' case-'''I'''nsensitive
 +
** '''m''' '''M'''ultiline mode - ^ and $ match internal lines
 +
** '''o''' compile pattern '''O'''nce
 +
** '''s''' match as a '''S'''ingle line - . (dot) matches \n
 +
** '''x''' e'''X'''tended legibility - free whitespace and comments
 
* '''s/'''<u>pattern</u>'''/'''<u>replacement</u>'''/'''''gi''; replaces ''pattern'' with ''replacement''
 
* '''s/'''<u>pattern</u>'''/'''<u>replacement</u>'''/'''''gi''; replaces ''pattern'' with ''replacement''
** '''g''' (global) means repeat the pattern search until there are no more matches
+
** all m/ options are available
** '''i''' (insensitive) means alphabetic matches are checked case-insensitively
+
** '''e''' '''E'''valuate replacement as an expression. May be specified multiple times. 'replacement' is interpreted as a double quoted string unless a single-quote (') is the delimiter.
 
* '''y/'''<u>searchlist</u>'''/'''<u>replacelist</u>'''/'''''d'': replaces each character found in <u>searchlist</u> with the corresponding character in <u>replacelist</u>
 
* '''y/'''<u>searchlist</u>'''/'''<u>replacelist</u>'''/'''''d'': replaces each character found in <u>searchlist</u> with the corresponding character in <u>replacelist</u>
 
** '''d''' just deletes matching characters
 
** '''d''' just deletes matching characters

Revision as of 20:18, 17 July 2006

Computing: Programming: Perl: regex

This article explains regular expressions in terms understandable to mere mortals, and also how to use them in Perl.

Related Articles

  • regex: manpage documentation

Details

Special characters in regex:

  • . = any character except newline (\n) (if /s option is included, then \n is also matched)
  • * = 0 or more of previous character
  • ^ = following string begins the line (except [^...] means "not these characters")
  • $ = preceding string ends the line
  • [] = list of characters which can satisfy the match at this position
    • Note: cannot use special characters like "." as part of list
  • {} = # of repetitions of previous character:
    • {x} -> exactly x repetitions
    • {x,y} -> minimum of x repetitions, maximum of y repetitions
  • | = alternatives
  • + = 1 or more of previous character
  • ? after +, *, or {} indicates non-greedy behavior, i.e. match the fewest characters, not the most
  • a-b = range of characters from a to b, e.g. "t-w" means any of t,u,v,w in that position
  • ?= = lookahead (need explanation of how this works) a(?=b) returns "a, but only if it's followed by a b"; the a becomes part of the matched sequence, but the b does not
  • ?<= = reverse lookahead (need explanation of how this works)

Operators used to invoke regex:

  • =~ returns TRUE if pattern matches
  • !~ returns FALSE if pattern matches
  • m/ searches a string for a pattern match; returns true/false scalar and an array of matches (if () are used)
    • c don't reset pos on failed matches when using /g
    • g (Global) all occurrences – repeat the pattern search until there are no more matches
    • i case-Insensitive
    • m Multiline mode - ^ and $ match internal lines
    • o compile pattern Once
    • s match as a Single line - . (dot) matches \n
    • x eXtended legibility - free whitespace and comments
  • s/pattern/replacement/gi; replaces pattern with replacement
    • all m/ options are available
    • e Evaluate replacement as an expression. May be specified multiple times. 'replacement' is interpreted as a double quoted string unless a single-quote (') is the delimiter.
  • y/searchlist/replacelist/d: replaces each character found in searchlist with the corresponding character in replacelist
    • d just deletes matching characters
  • tr/ is the same as y/

Examples

These examples have been tested only briefly.

  • Replace "thingy" with "stuffs" in $string:
    • $string =~ s/thingy/stuffs/;
  • Keep only the part of $string before the final "/" (using "|" as the delimiter instead of "/"):
    • $string =~ s|(.*)/[^/]*|$1|;
  • ...after the final "/":
    • $string =~ s| ^.*/([^/]*)$|$1|;
  • ...before the final "-":
    • $string =~ s|(.*)-[^-]*|$1|;
  • ...before the final ".":
    • $string =~ s|(.*)\.[^\.]*|$1|;
  • ...after the final "." (both of these return the full string if no "." is found):
    • $string =~ s|^.+\.(.+$)|$1|;
    • $string =~ s|^.*\.([^\.]*)$|$1|;