正则表达式
正则表达式就是应用在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。
元字符,metacharacter: . 匹配除换行符以外的任意字符 * 前边的内容可以连续重复使用任意次以使整个表达式得到匹配。因此,.*连在一起就意味着任意数量的不包含换行的字符。
字符转义:查找元字符,在其前面加上
字符类:[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!),指定一个字符范围,像[0-9]代表的含意与d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于w(如果只考虑英文的话)
分支条件;正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开,匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件。
分组:子表达式(也叫做分组)用小括号()表示,可以指定这个子表达式的重复次数
反义: W 匹配任意不是字母,数字,下划线,汉字的字符
后向引用:用于重复搜索前面某个分组匹配的文本。 捕获
零宽断言: (?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如bw+(?=ingb),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
负向零宽断言:(?!exp),断言此位置的后面不能匹配表达式exp 一个更复杂的例子:(?<=<(w+)>).*(?=</1>)匹配不包含属性的简单HTML标签内里的内容。(?<=<(w+)>)指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>),然后是.*(任意的字符串),最后是一个后缀(?=</1>)。注意后缀里的/,它用到了前面提过的字符转义;1则是一个反向引用,引用的正是捕获的第一组,前面的(w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。整个表达式匹配的是<b>和</b>之间的内容(再次提醒,不包括前缀和后缀本身)。
注释: (?<= # 断言要匹配的文本的前缀
贪婪与懒惰: 贪婪匹配模式.*会匹配整个字符串。 *? 重复任意次,但尽可能少重复
处理选项: IgnoreCase(忽略大小写) 匹配时不区分大小写。 在C#中,你可以使用Regex(String,RegexOptions)构造函数来设置正则表达式的处理选项。如: Regex regex = new Regex(@"baw{6}b",RegexOptions.IgnoreCase);
(?'group') 把捕获的内容命名为group,并压入堆栈(Stack) (?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败 (?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分 (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
其他: a报警字符(打印它的效果是电脑嘀一声) b通常是单词分界位置,但如果在字符类里使用代表退格 t制表符,Tab r回车 v竖向制表符 f换页符 n换行符 eEscape nnASCII代码中八进制代码为nn的字符 xnnASCII代码中十六进制代码为nn的字符 unnnnUnicode代码中十六进制代码为nnnn的字符 cNASCII控制字符。比如cC代表Ctrl+C A字符串开头(类似^,但不受处理多行选项的影响) Z字符串结尾或行尾(不受处理多行选项的影响) z字符串结尾(类似$,但不受处理多行选项的影响) G当前搜索的开头 p{name}Unicode中命名为name的字符类,例如p{IsGreek} (?>exp)贪婪子表达式 (?<x>-<y>exp)平衡组 (?im-nsx:exp)在子表达式exp中改变处理选项 (?im-nsx)为表达式后面的部分改变处理选项 (?(exp)yes|no)把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no (?(exp)yes)同上,只是使用空表达式作为no (?(name)yes|no)如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no (?(name)yes)同上,只是使用空表达式作为no (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |