这个正则表达式怎么写啊:将下划线加小写字母转化为大写字母,如_b pdf转为wordD

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&正则表达式js正则表达式: 大小写字母 数字 横杠 下划线 点 减号 可以换行 怎么写啊_百度知道
正则表达式js正则表达式: 大小写字母 数字 横杠 下划线 点 减号 可以换行 怎么写啊
我有更好的答案
d-_&#92var reg = &#47.&#92;;^[a-z&#92;r&#92;n]+$/i
现在又加了个条件首位空格去掉中间空格不去掉,但是换行之后每一行的首位空格要去掉,一行中字符串中间的空格不去掉怎么弄啊!
var reg =&#47;^&#92;s+|&#92;s+$&#47;var str=&&;str.replace(reg,&&);
其他类似问题
为您推荐:
退伍军人的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁一、什么是正则
正则是匹配特定格式文本的一种模式。
正则表达式为匹配文本的一组标记符. 说白了,就是一些字符(&元字符),匹配了多少次(重复),在哪里(位置)匹配的范式.&
有几个关键字:元字符,重复,位置
二、元字符
一句话:对于以元字符转为大写为最反义,字符组中加&^&取反义,元字符本身需转义
表1.常用的元字符
匹配除换行符以外的任意字符
匹配字母或数字或下划线或汉字
匹配任意的空白符
匹配单词的开始或结束
匹配字符串的开始
匹配字符串的结束
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
表2.常用的反义代码
代码/语法说明
匹配任意不是字母,数字,下划线,汉字的字符
匹配任意不是空白符的字符
匹配任意非数字的字符
匹配不是单词开头或结束的位置
匹配除了x以外的任意字符
匹配除了aeiou这几个字母以外的任意字符
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\.
例如:unibetter\.com匹配,C:\\Windows匹配C:\Windows。
& & 一句话:当重复后加一个?号,即表示为懒惰匹配,默认为贪婪匹配&
常用的限定符
代码/语法说明
重复零次或更多次
重复一次或更多次
重复零次或一次
重复n次或更多次
重复n到m次
贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权&&The match that begins earliest wins。
表.懒惰限定符
代码/语法说明
重复任意次,但尽可能少重复
重复1次或更多次,但尽可能少重复
重复0次或1次,但尽可能少重复
重复n到m次,但尽可能少重复
重复n次以上,但尽可能少重复
& & 一句话:只断言(判断)位置,不去匹配,只定位就像"^","$"。(?&=exp)exp2(?=exp3) 匹配以exp开始,以exp3结束的exp2部份。 比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分)
(?&!exp) exp2 (?!exp3) 这个相反喽。
何为断言:断言某个位置会出现,或不会出现某个模式,但不去匹配这个模式。当断言不成功时,不再匹配。
接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。最好还是拿例子来说明吧:
断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?&=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?&=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?&=\d)\d{3})+\b,用它对进行查找时结果是。
下面这个例子同时使用了这两种断言:(?&=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
负向零宽断言
前面我们提到过怎么查找不是某个字符或不在某个字符类里的字符的方法(反义)。但是如果我们只是想要确保某个字符没有出现,但并不想去匹配它时怎么办?例如,如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样:
\b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的单词。但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错。这是因为[^u]总要匹配一个字符,所以如果q是单词的最后一个字符的话,后面的[^u]将会匹配q后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的\w*\b将会匹配下一个单词,于是\b\w*q[^u]\w*\b就能匹配整个Iraq fighting。负向零宽断言能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:\b\w*q(?!u)\w*\b。
零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
同理,我们可以用(?&!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?&![a-z])\d{7}匹配前面不是小写字母的七位数字。
请详细分析表达式(?&=&(\w+)&).*(?=&\/\1&),这个表达式最能表现零宽断言的真正用途。
一个更复杂的例子:(?&=&(\w+)&).*(?=&\/\1&)匹配不包含属性的简单HTML标签内里的内容。(?&=&(\w+)&)指定了这样的前缀:被尖括号括起来的单词(比如可能是&b&),然后是.*(任意的字符串),最后是一个后缀(?=&\/\1&)。注意后缀里的\/,它用到了前面提过的字符转义;\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是&b&的话,后缀就是&/b&了。整个表达式匹配的是&b&和&/b&之间的内容(再次提醒,不包括前缀和后缀本身)。
五、常见的等
正则表达式难,有很在一部份原因是因为同一种匹配有多部写法,以下为常见的相等
\d = &[0-9]
\w=[A-Za-z_0-9]
六、从字符说开来
取反 &如[^abc]&
当在元字符后时,表示匹配0到1次,即可选的,区别与+(1,无穷),*(0,无穷)&
在贪婪与懒惰中表示懒惰匹配,例: +? , *? , ?? , {1,4}? 。&
在后向引用中,例:(?&=exp) ,(?=exp) .&
捕获 (?:exp) , (?&name&exp) , ()&
&使用圆括号分组&
表示可选择性,交替选择&
我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。
(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。
IP地址中每个数字都不能大于255,大家千万不要被《24》第三季的编剧给忽悠了&&
不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。
理解这个表达式的关键是理解2[0-4]\d|25[0-5]|[01]?\d\d?,这里我就不细说了,你自己应该能分析得出来它的意义。
不幸的是,刚才那个表达式也能匹配010)或(022-这样的&不正确&的格式。要解决这个问题,我们需要用到分枝条件。正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。听不明白?没关系,看例子:
0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-),一种是4位区号,7位本地号()。
\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。
\d{5}-\d{4}|\d{5}这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
呃&&其实,组号分配还不像我刚说得那么简单:
分组0对应整个正则表达式
实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组号
你可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权.
后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。难以理解?请看示例:
\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。
你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?&Word&\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k&Word&,所以上一个例子也可以写成这样:\b(?&Word&\w+)\b\s+\k&Word&\b。
使用小括号的时候,还有很多特定用途的语法。下面列出了最常用的一些:
表4.常用分组语法
分类代码/语法说明
匹配exp,并捕获文本到自动命名的组里
(?&name&exp)
匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
匹配exp,不捕获匹配的文本,也不给此分组分配组号
匹配exp前面的位置
匹配exp后面的位置
匹配后面跟的不是exp的位置
匹配前面不是exp的位置
(?#comment)
这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
我们已经讨论了前两种语法。第三个(?:exp)不会改变正则表达式的处理方式,只是这样的组匹配的内容不会像前两种那样被捕获到某个组里面,也不会拥有组号。&我为什么会想要这样做?&&&好问题,你觉得为什么呢?
捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。
捕获组有两种形式,一种是普通捕获组,另一种是命名捕获组,通常所说的捕获组指的是普通捕获组。语法如下:
普通捕获组:(Expression)
命名捕获组:(?&name&Expression)
普通捕获组在大多数支持正则表达式的语言或工具中都是支持的,而命名捕获组目前只有.NET、PHP、Python等部分语言支持,据说Java会在7.0中提供对这一特性的支持。上面给出的命名捕获组的语法是.NET中的语法,另外在.NET中使用(?&name&Expression)与使用(?&name&Expression)是等价的。在PHP和Python中命名捕获组语法为:(?P&name&Expression)。
另外需要说明的一点是,除(Expression)和(?&name&Expression)语法外,其它的(?...)语法都不是捕获组。
八、处理选项
在C#中,你可以使用来设置正则表达式的处理选项。如:Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);
上面介绍了几个选项如忽略大小写,处理多行等,这些选项能用来改变处理正则表达式的方式。下面是.Net中常用的正则表达式选项:
表6.常用的处理选项
IgnoreCase(忽略大小写)
匹配时不区分大小写。
Multiline(多行模式)
更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)
Singleline(单行模式)
更改.的含义,使它与每一个字符匹配(包括换行符\n)。
IgnorePatternWhitespace(忽略空白)
忽略表达式中的非转义空白并启用由#标记的注释。
ExplicitCapture(显式捕获)
仅捕获已被显式命名的组。
一个经常被问到的问题是:是不是只能同时使用多行模式和单行模式中的一种?答案是:不是。这两个选项之间没有任何关系,除了它们的名字比较相似(以至于让人感到疑惑)以外。
九、平衡组/递归匹配
这里介绍的平衡组语法是由.Net Framework支持的;其它语言/库不一定支持这种功能,或者支持此功能但需要使用不同的语法。
有时我们需要匹配像( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构,这时简单地使用\(.+\)则只会匹配到最左边的左括号和最右边的右括号之间的内容(这里我们讨论的是贪婪模式,懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次数不相等,比如( 5 / ( 3 + 2 ) ) ),那我们的匹配结果里两者的个数也不会相等。有没有办法在这样的字符串里匹配到最长的,配对的括号之间的内容呢?
为了避免(和\(把你的大脑彻底搞糊涂,我们还是用尖括号代替圆括号吧。现在我们的问题变成了如何把xx &aa &bbb& &bbb& aa& yy这样的字符串里,最长的配对的尖括号内的内容捕获出来?
这里需要用到以下的语法构造:
(?'group')&把捕获的内容命名为group,并压入堆栈(Stack)
(?'-group')&从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
(?(group)yes|no)&如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
(?!)&零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
如果你不是一个程序员(或者你自称程序员但是不知道堆栈是什么东西),你就这样理解上面的三种语法吧:第一个就是在黑板上写一个"group",第二个就是从黑板上擦掉一个"group",第三个就是看黑板上写的还有没有"group",如果有就继续匹配yes部分,否则就匹配no部分。
我们需要做的是每碰到了左括号,就在压入一个"Open",每碰到一个右括号,就弹出一个,到了最后就看看堆栈是否为空--如果不为空那就证明左括号比右括号多,那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符),尽量使整个表达式得到匹配。
#最外层的左括号
#最外层的左括号后面的不是括号的内容
(?'Open'&)
#碰到了左括号,在黑板上写一个"Open"
#匹配左括号后面的不是括号的内容
(?'-Open'&)
#碰到了右括号,擦掉一个"Open"
#匹配右括号后面不是括号的内容
(?(Open)(?!))
#在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还有,则匹配失败
#最外层的右括号
平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配嵌套的&div&标签:&div[^&]*&[^&&]*(((?'Open'&div[^&]*&)[^&&]*)+((?'-Open'&/div&)[^&&]*)+)*(?(Open)(?!))&/div&.
十、记忆关键字
五个关键字 :字符,位置,重复,分组
十一、引用:
阅读(...) 评论()正则表达式参考文档 - Regular Expression Syntax Reference
本页导读:
------------
------------
揭开正则表达式的神秘面纱
[原创文章,转载请保留或注明出处:]
&&& 正则表达式(regular
expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征。
&&& 正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的替换更强大。
&& 正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。
&&& 文章中的每一个举例,都可以点击进入到测试页面进行测试。闲话少说,开始。
1. 正则表达式规则
1.1 普通字符
字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是&普通字符&。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。
&&& ,匹配结果是:成功;匹配到的内容是:&c&;匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同)
&&& ,匹配结果是:成功;匹配到的内容是:&bcd&;匹配到的位置是:开始于1,结束于4。
1.2 简单的转义字符
&&& 一些不便书写的字符,采用在前面加 &\& 的方法。这些字符其实我们都已经熟知了。
代表回车和换行符
代表 &\& 本身
&&& 还有其他一些在后边章节中有特殊用处的标点符号,在前面加 &\&
后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 &^& 和 &$& 字符,则表达式就需要写成 &\^& 和
匹配 ^ 符号本身
匹配 $ 符号本身
匹配小数点(.)本身
&&& 这些转义字符的匹配方法与 &普通字符& 是类似的。也是匹配与之相同的一个字符。
&&& ,匹配结果是:成功;匹配到的内容是:&$d&;匹配到的位置是:开始于3,结束于5。
1.3 能够与 '多种字符' 匹配的表达式
&&& 正则表达式中的一些表示方法,可以匹配 '多种字符' 其中的任意一个字符。比如,表达式
可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。
任意一个数字,0~9 中的任意一个
任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个
包括空格、制表符、换页符等空白字符的其中任意一个
小数点可以匹配除了换行符(\n)以外的任意一个字符
&&& ,匹配的结果是:成功;匹配到的内容是:&12&;匹配到的位置是:开始于3,结束于5。
&&& ,匹配的结果是:成功;匹配到的内容是:&aa1&;匹配到的位置是:开始于1,结束于4。
1.4 自定义能够匹配 '多种字符' 的表达式
&&& 使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ]
包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。
匹配 &a& 或 &b& 或 &5& 或 &@&
匹配 &a&,&b&,&c& 之外的任意一个字符
匹配 &f&~&k& 之间的任意一个字母
匹配 &A&~&F&,&0&~&3& 之外的任意一个字符
&&& ,匹配的结果是:成功;匹配到的内容是:&bc&;匹配到的位置是:开始于1,结束于3。
&&& ,匹配的结果是:成功;匹配到的内容是:&1&;匹配到的位置是:开始于3,结束于4。
1.5 修饰匹配次数的特殊符号
&&& 前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。
&&& 使用方法是:&次数修饰&放在&被修饰的表达式&后边。比如:&[bcd][bcd]& 可以写成 &[bcd]{2}&。
表达式重复n次,比如:;
表达式至少重复m次,最多重复n次,比如:
表达式至少重复m次,比如:
匹配表达式0次或者1次,相当于 {0,1},比如:
表达式至少出现1次,相当于 {1,},比如:
表达式不出现或出现任意次,相当于 {0,},比如:
&&& ,匹配的结果是:成功;匹配到的内容是:&12.5&;匹配到的位置是:开始于10,结束于14。
&&& ,匹配的结果是:成功;匹配到的内容是:&goooooogle&;匹配到的位置是:开始于7,结束于17。
1.6 其他一些代表抽象意义的特殊符号
&&& 一些符号在表达式中代表抽象的特殊意义:
与字符串开始的地方匹配,不匹配任何字符
与字符串结束的地方匹配,不匹配任何字符
匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符
&&& 进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。
&&& ,匹配结果是:失败。因为 &^& 要求与字符串开始的地方匹配,因此,只有当 &aaa&
位于字符串的开头的时候,&^aaa& 才能匹配,。
&&& ,匹配结果是:失败。因为 &$& 要求与字符串结束的地方匹配,因此,只有当 &aaa&
位于字符串的结尾的时候,&aaa$& 才能匹配,。
&&& ,匹配结果是:成功;匹配到的内容是:&@a&;匹配到的位置是:开始于2,结束于4。
&&& 进一步说明:&\b&
与 &^& 和 &$& 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 &\w& 范围,另一边是
非&\w& 的范围。
&&& ,匹配结果是:成功;匹配到的内容是:&end&;匹配到的位置是:开始于15,结束于18。&&& 一些符号可以影响表达式内部的子表达式之间的关系:
左右两边表达式之间 &或& 关系,匹配左边或者右边
(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
&&& ,匹配结果是:成功;匹配到的内容是:&Tom&;匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:&Jack&;匹配到的位置时:开始于15,结束于19。
&&& ,匹配结果是:成功;匹配到内容是:&go go go&;匹配到的位置是:开始于6,结束于14。
&&& ,匹配的结果是:成功;匹配到的内容是:&¥20.5&;匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:&20.5&。
2. 正则表达式中的一些高级规则2.1 匹配次数中的贪婪与非贪婪
&&& 在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:&{m,n}&, &{m,}&, &?&, &*&, &+&,具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 &dxxxdxxxd&,举例如下:
&\w+& 将匹配第一个 &d& 之后的所有字符 &xxxdxxxd&
&\w+& 将匹配第一个 &d& 和最后一个 &d& 之间的所有字符 &xxxdxxx&。虽然 &\w+& 也能够匹配上最后一个 &d&,但是为了使整个表达式匹配成功,&\w+& 可以 &让出& 它本来能够匹配的最后一个 &d&
&&& 由此可见,&\w+& 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 &d&,但那也是为了让整个表达式能够匹配成功。同理,带 &*& 和 &{m,n}& 的表达式都是尽可能地多匹配,带 &?& 的表达式在可匹配可不匹配的时候,也是尽可能的 &要匹配&。这
种匹配原则就叫作 &贪婪& 模式
&&& 非贪婪模式:
&&& 在修饰匹配次数的特殊符号后再加上一个 &?& 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 &不匹配&。这种匹配原则叫作 &非贪婪& 模式,也叫作 &勉强& 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 &dxxxdxxxd& 举例:
&\w+?& 将尽可能少的匹配第一个 &d& 之后的字符,结果是:&\w+?& 只匹配了一个 &x&
为了让整个表达式匹配成功,&\w+?& 不得不匹配 &xxx& 才可以让后边的 &d& 匹配,从而使整个表达式匹配成功。因此,结果是:&\w+?& 匹配 &xxx&
&&& 更多的情况,举例如下:
&&& ,匹配的结果是:成功;匹配到的内容是 &&td&&p&aa&/p&&/td& &td&&p&bb&/p&&/td&& 整个字符串,
表达式中的 &&/td&& 将与字符串中最后一个 &&/td&& 匹配。
&&& ,将只得到 &&td&&p&aa&/p&&/td&&,
再次匹配下一个时,可以得到第二个
&&td&&p&bb&/p&&/td&&。
2.2 反向引用 \1, \2...
&&& 表达式在匹配时,表达式引擎会将小括号 &( )& 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 &&td&(.*?)&/td&&。
&&& 其实,&小括号包含的表达式所匹配到的字符串& 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 &括号内的子匹配已经匹配到的字符串&。引用方法是 &\& 加上一个数字。&\1& 引用第1对括号内匹配到的字符串,&\2& 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 &(& 在前,那这一对就先排序号。
&&& 举例如下:
&&& ,匹配结果是:成功;匹配到的内容是:& 'Hello' &。再次匹配下一个时,可以匹配到 & &World& &。
&&& ,匹配结果是:成功;匹配到的内容是 &ccccc&。再次匹配下一个时,将得到 。这个表达式要求 &\w& 范围的字符至少重复5次,。
&&& ,匹配结果是成功。如果 &&td&& 与 &&/td&& 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。
2.3 预搜索,不匹配;反向预搜索,不匹配
&&& 前面的章节中,我讲到了几个代表抽象意义的特殊符号:&^&,&$&,&\b&。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对 &字符串的两头& 或者 &字符之间的缝隙& 附加了一个条件。理解到这个概念以后,本节将继续介绍另外一种对 &两头& 或者 &缝隙& 附加条件的,更加灵活的表示方法。
&&& 正向预搜索:&(?=xxxxx)&,&(?!xxxxx)&
&&& 格式:&(?=xxxxx)&,在被匹配的字符串中,它对所处的 &缝隙& 或者 &两头& 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 &\b&,本身不匹配任何字符。&\b& 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。
&&& ,将只匹配 &Windows NT& 中的 &Windows &,其他的 &Windows & 字样则不被匹配。
&&& ,将可以匹配6个&f&的前4个,可以匹配9个&9&的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。
&&& 格式:&(?!xxxxx)&,所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。
&&& ,将从头一直匹配到 &stop& 之前的位置,如果字符串中没有 &stop&,则匹配整个字符串。
&&& ,只能匹配 &do&。在本条举例中,&do& 后边使用 &(?!\w)& 和使用 &\b& 效果是一样的。
&&& 反向预搜索:&(?&=xxxxx)&,&(?&!xxxxx)&
&&& 这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 &左侧&,两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 &正向预搜索& 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。
&&& 举例5:表达式 &(?&=\d{4})\d+(?=\d{4})& 在匹配 &3456& 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索,因此,本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions
命名空间,以及本站推荐的。
3. 其他通用规则
&&& 还有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解过程中没有提到。
3.1 表达式中,可以使用 "\xXX" 和 "\uXXXX" 表示一个字符("X" 表示一个十六进制数)
编号在 0 ~ 255 范围的字符,比如:
任何字符可以使用 "\u" 再加上其编号的4位十六进制数表示,比如:
3.2 在表达式 "\s","\d","\w","\b" 表示特殊意义的同时,对应的大写字母表示相反的意义
3.3 在表达式中有特殊意义,需要添加 "\" 才能匹配该字符本身的字符汇总
匹配输入字符串的开始位置。要匹配 &^& 字符本身,请使用 &\^&
匹配输入字符串的结尾位置。要匹配 &$& 字符本身,请使用 &\$&
标记一个子表达式的开始和结束位置。要匹配小括号,请使用 &\(& 和 &\)&
用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]"
修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}"
匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."
修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"
修饰匹配次数为至少 1 次。要匹配 &+& 字符本身,请使用 &\+&
修饰匹配次数为 0 次或任意次。要匹配 &*& 字符本身,请使用 &\*&
左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|"
3.4 括号 "( )" 内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用 "(?:xxxxx)" 格式
&&& ,结果是 "bbccdd"。括号 "(?:)" 范围的匹配结果不进行记录,因此 "(\w)" 使用 "\1" 来引用。
3.5 常用的表达式属性设置简介:Ignorecase,Singleline,Multiline,Global
表达式属性
Ignorecase
默认情况下,表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎,把 &大小写& 概念延伸至 UNICODE 范围的大小写。
Singleline
默认情况下,小数点 &.& 匹配除了换行符(\n)以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。
默认情况下,表达式 &^& 和 &$& 只匹配字符串的开始 ① 和结尾 ④ 位置。如:
①xxxxxxxxx②\n
③xxxxxxxxx④
配置为 Multiline 可以使 &^& 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置,使 &$& 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。
主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。
4. 其他提示
4.1 如果想要了解高级的正则引擎还支持那些复杂的正则语法,可参见。
4.2 如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用 &^& 和 &$&,比如:&^\d+$& 要求整个字符串只有数字。
4.3 如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用 &\b&,比如:。
4.4 表达式不要匹配空字符串。否则会一直得到匹配成功,而结果什么都没有匹配到。比如:准备写一个匹配 &123&、&123.&、&123.5&、&.5& 这几种形式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成:&\d*\.?\d*&,因为如果什么都没有,这个表达式也可以匹配成功。。
4.5 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,那么情况可能比上一条所说的更严重,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。
4.6 合理选择贪婪模式与非贪婪模式,参见。
4.7 或 &|& 的左右两边,对某个字符最好只有一边可以匹配,这样,不会因为 &|& 两边的表达式因为交换位置而有所不同。
5. 进阶与实战
5.1 重要提示:本站 正则工具 Regex Match Tracer 2.1
(免费)已可以免费无限制使用:
5.2 下载正则表达式文档 chm 版本
&&& [] - DEELX 正则语法,包含其他高级语法的 chm 版本。
5.3 更多深入话题及使用案例
&&& [] - 讨论如何使用不支持递归的正则引擎匹配嵌套结构
&&& [] - 本页的“”功能,采用 javascript 的正则表达式实现的。
&&&&&&& 比如表达式:
(a+b|[cd])$ 
& 2005 - &}

我要回帖

更多关于 pdf转为word 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信