正则

转载 2011年01月22日 22:03:00
从某种意义上来说,正则就是通配符(如*、?)的加强版写法。


注释语法:(?#comment) ,其中comment代表注释内容。
正则中转义符为“/”
正则中可以使用条件进行限制,符号为“|”(意思应该是“或”)



* 匹配*前面的字符任意次(最少0次)

+ 匹配前面的字符重复1次或更多次

? 匹配前面的字符零次或一次

/b代表单词开始或结束位置(可以是空格、标点、回车、TAB等)

--例:/ba.+/b 代表匹配以a开始的单词后换行之前的本句所有字符
--/ba*/b 代表匹配仅以字母a组成的单词(如a、aa、aaaaa……)



. 可以匹配除换行外任意字符

/d 匹配一个数字(范围:0-9)

{n} 代表匹配前面的字符n次

{n,} 代表匹配前面的字符至少n次

{n,m} 代表匹配前面的字符至少n次,至多m次(符号均为半角,中间不可有空格)

--例:/d{5,} 代表需要匹配的对象中最少有连续5个数字




/s 匹配任何空白字符,包括空格、制表符、换页符等等。

/w 匹配字母或数字或下划线或汉字 

^ 匹配字符串的开始 
$ 匹配字符串的结束 

--例:^/w{6}/s/w+$ 代表整个文本必须是以由6个字符(仅包括字母、数字、开线、汉字)组成的单词开头,并紧跟一个空白字符,然后是由至少一个单词字符构成的单词结束。




[字符] 这种形式可以预定要匹配的字符,比如[aeiou]可以匹配任意一个且仅一个元音字母。

[.?!] 匹配(.或?或!)这三个中任意一个标点符号。





/f 匹配一个换页符。等价于 /x0c 和 /cL。 

/n 匹配一个换行符。等价于 /x0a 和 /cJ。 

/r 匹配一个回车符。等价于 /x0d 和 /cM。

/t 匹配一个制表符。等价于 /x09 和 /cI。 

/v 匹配一个垂直制表符。等价于 /x0b 和 /cK。



重复多个字符可以使用分组,符号为“()”。此处()内的内容应该看做一个整体。
每个组都会有自己的名字,若没有人为命名则从第一个组开始依次为:/1 /2 /3 ……

分组的命名方式为(?<组名>/d*/b)或(?'组名'/d*/b)。

人为命名的分组引用方式为:/k<组名> 或 /k'组名'

实际上组号分配过程要从左向右扫描两遍:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组号 

分组0对应整个正则表达式 

--例:/b(/w+)/b/s+/1/b 用这个表达式可以轻松的找出连续重复的单词,具体怎么解释~~ “你懂的”




反义:将元字符转换为大写既是反义。(这里不清楚是否所有的元字符大写都是反义)

/W 匹配任意不是字母,数字,下划线,汉字的字符 
/B 匹配不是单词开头或结束的位置 
[^x] 匹配除了x以外的任意字符 
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符 







零宽断言,分为正向(既匹配)与负向(既不匹配)两种。

语法如下:
(?=Examples) 匹配Examples前面的位置 
(?<=Examples) 匹配Examples后面的位置 
(?!Examples) 匹配((?!Examples)这个表达式)后面跟的不是Examples的位置 
(?<!Examples) 匹配((?!Examples)这个表达式)前面不是Examples的位置 


顾名思义,使用零宽断言不浪费字符位置。比如需要查找:包含字母t且t后面不是字母c的一个单词。此时可以使用如下正则表达式:/b/w*t[^c]/w*/b 。但如果此单词最后一位是t的情况下[^c]依然会继续匹配下一个字符,那么若用来匹配do not giev up 会取出 "not giev"两个单词。

是的,这并不是我的原意。

那好的,现在我使用 /b/w*t(?!c)/w*/b 来匹配。哇太棒了,结果是"not"!不得不承认我是个天才~~




贪婪匹配(最多匹配)

在使整个表达式能得到匹配的前提下匹配尽可能多的字符。

--例:a.*b 用来匹配ababababababab时会将ababababababab整个提取出来。

懒惰匹配(最少匹配)

在能使整个匹配成功的前提下使用最少的重复

--例:a.*?b 用来匹配ababababababab时会将ab切割提取出来,既只提取了第一个ab。





捕获 (不怎么理解这东西···哪位高手给讲下)

(Examples) 匹配Examples,并捕获文本到自动命名的组里
(?<name>Examples) 匹配Examples,并捕获文本到名称为name的组里,也可以写成(?'name'Examples)
(?:Examples) 匹配Examples,不捕获匹配的文本,也不给此分组分配组号
 
 

 

 

#1楼
原义字符集:


/b 匹配一个单词边界,也就是指单词和空格(或标点,jorln)间的位置。

/B 匹配非单词边界。 

/cx 匹配由x指明的控制字符。 

/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 为十六进制转义值。十六进制转义值必须为确定的两个数字长。

/num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。 

/n 标识一个八进制转义值或一个后向引用。如果 /n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 

/nm 标识一个八进制转义值或一个后向引用。如果 /nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 /nm 之前至少有 n 个获取,则 n 为一个后跟

文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 /nm 将匹配八进制转义值 nm。 

/nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 

/un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。

[/u4E00-/u9FA5] 匹配汉字

相关文章推荐

正则工具和文档

  • 2016年05月21日 09:59
  • 126KB
  • 下载

java+Jsoup 正则过滤html网页标签【多线程数据采集之二】

ava采集数据,获取了 html整个文本之后。  该考虑的是如何过滤掉html标签, 得到自己所需要的重要数据了。 实现方法有多种办法,第一:用正则,第二:用第三方jar包,其实本质也...

正则离线调试工具

  • 2017年10月11日 21:00
  • 29KB
  • 下载

运用正则抓取网页数据

  • 2015年08月11日 11:44
  • 28KB
  • 下载

正则表达式+精准高效正则(终极篇)

如果纯粹是为了挑战自己的正则水平,用来实现一些特效(例如使用正则表达式计算质数、解线性方程),效率不是问题;如果所写的正则表达式只是为了满足一两次、几十次的运行,优化与否区别也不太大。但是,如果所写的...
  • s_jobs
  • s_jobs
  • 2012年10月26日 10:45
  • 1673

c++控制台计算器(正则)

  • 2015年12月11日 15:05
  • 3KB
  • 下载

正则调试工具

  • 2015年10月21日 13:04
  • 830KB
  • 下载

正则大作战 基础篇(一)

我眼里的正则/([^&]*)(&|$)/ === 龘靐齉齾龗麤鱻爩龖吁 灪麣鸾鹂鲡驫饢籱癵爨 滟厵麷鸜郁骊钃讟虋纞 龞齽齼鼺黸麢鹳鹦鸙鸘 这是什么 这又是什么 我是谁,我在哪里,我为什么要怼...

ios 用lua 正则

  • 2016年02月18日 14:52
  • 24KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:正则
举报原因:
原因补充:

(最多只允许输入30个字)