正则表达式学习:正则表达式学习笔记来源: 发布时间:星期日, 2009年9月6日 浏览:2次 评论:0
正则表达式学习笔记
正则表达式(regular expression)描述了种串匹配模式可以用来检查个串是否含 有某种子串、将匹配子串做替换或者从某个串中取出符合某个条件子串等 列目录时 dir *.txt或ls *.txt中*.txt就不是个正则表达式,这里*和正则式* 含义是区别 为便于理解和记忆先从些概念入手所有特殊或组合有个总表在后面最后 些例子供理解相应概念 正则表达式 是由普通(例如 a 到 z)以及特殊(称为元)组成文字模式正则表达 式作为个模板将某个模式和所搜索串进行匹配 可以通过在对分隔符的间放入表达式模式各种组件来构造个正则表达式 即/expression/ 普通 由所有那些未显式指定为元打印和非打印组成这包括所有大写和小写字母 所有数字所有标点符号以及些符号 非打印 含义 \cx 匹配由x指明控制例如 \cM 匹配个 Control-M 或回车符x 值必须为 A-Z 或 a-z 的否则将 c 视为个原义 'c' \f 匹配个换页符等价于 \x0c 和 \cL \n 匹配个换行符等价于 \x0a 和 \cJ \r 匹配个回车符等价于 \x0d 和 \cM \s 匹配任何空白包括空格、制表符、换页符等等等价于 [ \f\n\r\t\v] \S 匹配任何非空白等价于 [^ \f\n\r\t\v] \t 匹配个制表符等价于 \x09 和 \cI \v 匹配个垂直制表符等价于 \x0b 和 \cK 特殊 所谓特殊就是些有特殊含义如上面说"*.txt"中*简单说就是表示任 何串意思如果要查找文件名中有*文件则需要对*进行转义即在其前加个\ls \*.txt正则表达式有以下特殊 特别 介绍说明 $ 匹配输入串结尾位置如果设置了 RegExp 对象 Multiline 属性则 $ 也匹配 '\n' 或 '\r'要匹配 $ 本身请使用 \$ ( ) 标记个子表达式开始和结束位置子表达式可以获取供以后使用要匹配这些请使 用 \( 和 \) * 匹配前面子表达式零次或多次要匹配 * 请使用 \* + 匹配前面子表达式次或多次要匹配 + 请使用 \+ . 匹配除换行符 \n的外任何单要匹配 .请使用 \ [ 标记个中括号表达式开始要匹配 [请使用 \[ ? 匹配前面子表达式零次或次或指明个非贪婪限定符要匹配 ? 请使用 \? \ 将下个标记为或特殊、或原义、或向后引用、或 8进制转义符例如 'n' 匹 配 'n''\n' 匹配换行符序列 '\\' 匹配 "\"而 '\(' 则匹配 "(" ^ 匹配输入串开始位置除非在方括号表达式中使用此时它表示不接受该集合要匹 配 ^ 本身请使用 \^ { 标记限定符表达式开始要匹配 {请使用 \{ | 指明两项的间个选择要匹配 |请使用 \| 构造正则表达式思路方法和创建数学表达式思路方法样也就是用多种元和操作符将小表 达式结合在起来创建更大表达式正则表达式组件可以是单个、集合、范围 、间选择或者所有这些组件任意组合 限定符 限定符用来指定正则表达式个给定组件必须要出现多少次才能满足匹配有*或+或?或{n} 或{n,}或{n,m}共6种 *、+和?限定符都是贪婪它们会尽可能多匹配文字只有在它们后面加上个?就可以 实现非贪婪或最小匹配 正则表达式限定符有: 描述 * 匹配前面子表达式零次或多次例如zo* 能匹配 "z" 以及 "zoo"* 等价于{0,} + 匹配前面子表达式次或多次例如'zo+' 能匹配 "zo" 以及 "zoo"但不能匹配 "z"+ 等价于 {1,} ? 匹配前面子表达式零次或次例如"do(es)?" 可以匹配 "do" 或 "does" 中"do" ? 等价于 {0,1} {n} n 是个非负整数匹配确定 n 次例如'o{2}' 不能匹配 "Bob" 中 'o'但是能匹 配 "food" 中两个 o {n,} n 是个非负整数至少匹配n 次例如'o{2,}' 不能匹配 "Bob" 中 'o'但能匹配 "foooood" 中所有 o'o{1,}' 等价于 'o+''o{0,}' 则等价于 'o*' {n,m} m 和 n 均为非负整数其中n <= m最少匹配 n 次且最多匹配 m 次例如"o{1,3}" 将匹配 "fooooood" 中前 3个 o'o{0,1}' 等价于 'o?'请注意在逗号和两个数的间不能有空 格 定位符 用来描述串或单词边界^和$分别指串开始和结束\b描述单词前或后边界 \B表示非单词边界不能对定位符使用限定符 选择 用圆括号将所有选择项括起来相邻选择项的间用|分隔但用圆括号会有个副作用是 相关匹配会被缓存Cache此时可用?:放在第个选项前来消除这种副作用 其中?:是非捕获元的还有两个非捕获元是?=和?!这两个还有更多含义前者为正向预 查在任何开始匹配圆括号内正则表达式模式位置来匹配搜索串后者为负向预查在任 何开始不匹配该正则表达式模式位置来匹配搜索串 后向引用 对个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到个临时缓冲区中 所捕获每个子匹配都按照在正则表达式模式中从左至右所遇到内容存储存储子匹配缓冲区 编号从 1 开始连续编号直至最大 99 个子表达式每个缓冲区都可以使用 '\n' 访问其中 n 为个标识特定缓冲区位或两位十进制数 可以使用非捕获元 '?:', '?=', or '?!' 来忽略对相关匹配保存 各种操作符运算优先级 相同优先级从左到右进行运算区别优先级运算先高后低各种操作符优先级从高到低 如下: 操作符 描述 \ 转义符 , (?:), (?=), 圆括号和方括号 *, +, ?, {n}, {n,}, {n,m} 限定符 ^, $, \anymetacharacter 位置和顺序 | “或”操作 全部符号解释 描述 \ 将下个标记为个特殊、或个原义、或个 向后引用、或个 8进制转义符 例如'n' 匹配 "n"'\n' 匹配个换行符序列 '\\' 匹配 "\" 而 "\(" 则匹配 "(" ^ 匹配输入串开始位置如果设置了 RegExp 对象 Multiline 属性^ 也匹配 '\n' 或 '\r' 的后位置 $ 匹配输入串结束位置如果设置了RegExp 对象 Multiline 属性$ 也匹配 '\n' 或 '\r' 的前位置 * 匹配前面子表达式零次或多次例如zo* 能匹配 "z" 以及 "zoo"* 等价于{0,} + 匹配前面子表达式次或多次例如'zo+' 能匹配 "zo" 以及 "zoo"但不能匹配 "z"+ 等价于 {1,} ? 匹配前面子表达式零次或次例如"do(es)?" 可以匹配 "do" 或 "does" 中"do" ? 等价于 {0,1} {n} n 是个非负整数匹配确定 n 次例如'o{2}' 不能匹配 "Bob" 中 'o'但是能匹 配 "food" 中两个 o {n,} n 是个非负整数至少匹配n 次例如'o{2,}' 不能匹配 "Bob" 中 'o'但能匹配 "foooood" 中所有 o'o{1,}' 等价于 'o+''o{0,}' 则等价于 'o*' {n,m} m 和 n 均为非负整数其中n <= m最少匹配 n 次且最多匹配 m 次例如"o{1,3}" 将匹配 "fooooood" 中前 3个 o'o{0,1}' 等价于 'o?'请注意在逗号和两个数的间不能有空 格 ? 当该紧跟在任何个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时匹配模式是非贪 婪非贪婪模式尽可能少匹配所搜索串而默认贪婪模式则尽可能多匹配所搜索 串例如对于串 "oooo"'o+?' 将匹配单个 "o"而 'o+' 将匹配所有 'o' . 匹配除 "\n" 的外任何单个要匹配包括 '\n' 在内任何请使用象 '[.\n]' 模式 (pattern) 匹配 pattern 并获取这匹配所获取匹配可以从产生 Matches 集合得到在 VBScript 中使用 SubMatches 集合在JScript 中则使用 $0…$9 属性要匹配圆括号请 使用 '\(' 或 '\)' (?:pattern) 匹配 pattern 但不获取匹配结果也就是说这是个非获取匹配不进行存储供以 后使用这在使用 "或" (|) 来组合个模式各个部分是很有用例如 'industr (?:y|ies) 就是个比 'industry|industries' 更简略表达式 (?=pattern) 正向预查在任何匹配 pattern 串开始处匹配查找串这是个非获取 匹配也就是说该匹配不需要获取供以后使用例如'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中 "Windows" 但不能匹配 "Windows 3.1" 中 "Windows"预查不消耗字 符也就是说在个匹配发生后在最后次匹配的后立即开始下次匹配搜索而不是从包 含预查的后开始 (?!pattern) 负向预查在任何不匹配 pattern 串开始处匹配查找串这是个非获 取匹配也就是说该匹配不需要获取供以后使用例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中 "Windows"但不能匹配 "Windows 2000" 中 "Windows"预查不消耗 也就是说在个匹配发生后在最后次匹配的后立即开始下次匹配搜索而不是从包含 预查的后开始 x|y 匹配 x 或 y例如'z|food' 能匹配 "z" 或 "food"'(z|f)ood' 则匹配 "zood" 或 "food" [xyz] 集合匹配所包含任意个例如 '[abc]' 可以匹配 "plain" 中 'a' [^xyz] 负值集合匹配未包含任意例如 '[^abc]' 可以匹配 "plain" 中'p' [a-z] 范围匹配指定范围内任意例如'[a-z]' 可以匹配 'a' 到 'z' 范围内 任意小写字母 [^a-z] 负值范围匹配任何不在指定范围内任意例如'[^a-z]' 可以匹配任何不 在 'a' 到 'z' 范围内任意 \b 匹配个单词边界也就是指单词和空格间位置例如 'er\b' 可以匹配"never" 中 'er'但不能匹配 "verb" 中 'er' \B 匹配非单词边界'er\B' 能匹配 "verb" 中 'er'但不能匹配 "never" 中 'er' \cx 匹配由 x 指明控制例如 \cM 匹配个 Control-M 或回车符x 值必须为 A-Z 或 a-z 的否则将 c 视为个原义 'c' \d 匹配个数字等价于 [0-9] \D 匹配个非数字等价于 [^0-9] \f 匹配个换页符等价于 \x0c 和 \cL \n 匹配个换行符等价于 \x0a 和 \cJ \r 匹配个回车符等价于 \x0d 和 \cM \s 匹配任何空白包括空格、制表符、换页符等等等价于 [ \f\n\r\t\v] \S 匹配任何非空白等价于 [^ \f\n\r\t\v] \t 匹配个制表符等价于 \x09 和 \cI \v 匹配个垂直制表符等价于 \x0b 和 \cK \w 匹配包括下划线任何单词等价于'[A-Za-z0-9_]' \W 匹配任何非单词等价于 '[^A-Za-z0-9_]' \xn 匹配 n其中 n 为十 6进制转义值十 6进制转义值必须为确定两个数字长例 如'\x41' 匹配 "A"'\x041' 则等价于 '\x04' & "1"正则表达式中可以使用 ASCII 编码. \num 匹配 num其中 num 是个正整数对所获取匹配引用例如'(.)\1' 匹配两个连 续相同 \n 标识个 8进制转义值或个向后引用如果 \n 的前至少 n 个获取子表达式则 n 为向 后引用否则如果 n 为 8进制数字 (0-7)则 n 为个 8进制转义值 \nm 标识个 8进制转义值或个向后引用如果 \nm 的前至少有 nm 个获得子表达式则 nm 为向后引用如果 \nm 的前至少有 n 个获取则 n 为个后跟文字 m 向后引用如果前面 条件都不满足若 n 和 m 均为 8进制数字 (0-7)则 \nm 将匹配 8进制转义值 nm \nml 如果 n 为 8进制数字 (0-3)且 m 和 l 均为 8进制数字 (0-7)则匹配 8进制转义值 nml \un 匹配 n其中 n 是个用 4个十 6进制数字表示 Unicode 例如 \u00A9 匹配版 权符号 (?) 部分例子 正则表达式 介绍说明 /\b([a-z]+) \1\b/gi 个单词连续出现位置 /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 将个URL解析为协议、域、端口及相对路径 /^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节位置 /[-a-z]/ A至z共26个字母再加个-号 /ter\b/ 可匹配chapter而不能terminal /\Bapt/ 可匹配chapter而不能aptitude /Windows(?=95 |98 |NT )/ 可匹配Windows95或Windows98或WindowsNT,当找到个匹配后从 Windows后面开始进行下次检索匹配 0
相关文章读者评论发表评论 |