「嘉年华观会」正则表达式(二)

2024-09-25 21:44:39 浏览数 (1)

三、进阶用法

1、子表达式

子表达式的作用是把一个表达式中相关的部分组合在一起。用()来定义。常见用途为:      a) 对重复次数元字符的作用对象做出精确的设定和控制,例如:(d{1,3}.){3}d{1,3}来粗略匹配ip地址      b) 对|操作符的OR条件做出准确的定义。另外子表达式可以嵌套使用、频繁使用子表达式会降低效率

2、回溯引用

回溯引用允许正则表达式引用前面的匹配结果 应用场景:      a) 有一段文本,你想把这段文本中所有连续重复出现的单词找出来。     文本:      This is a block of of text, serveral words here are are repeated, and and they should not be.      正则表达式:      (w ) 1      结果:匹配出of of, are are, and and      解释: 匹配一个或多个空格,w 匹配一个单词,w 是放在()中的,是个子表达式,这里子表达式的作用是将这 一部分单独划分出来供后面引用,1是一个回溯引用,匹配w 具体匹配的内容,当(w )匹配到of时,1就是of。     b) 匹配下面html中的标题内容(h1-6标签)

代码语言:xml复制
		  <body>
		    <h1>welcome to my homepage</h1>
		    <h2>ColdFusion</h3>
		  </body>

     如果使用正则表达式 <h1-6>.*?</h1-6>,那么第二行也会被匹配进去,这很明显不是我们想要的,因为第二行的h2和h3标签不匹配。      我们应该使用<h(1-6)>.*?</h1>,这样<h2>ColdFusion</h3>不会匹配

    c) 替换     我们要把一堆电话号码313-555-1234替换成(313)555-1234     文本     313-555-1234     248-555-9999     正则表达式     (d{3})-(d{3})-(d{4})     替换     ($1)$2-$3     结果     (313)555-1234     (248)555-9999

    d) 大小写转换

<p align=center font-size=20px><strong>用来进行大小转换的元字符</strong></p>

元字符

说明

l

把下一个字符转换小写

u

把下一个字符转换大写

L

把L到E之间的字符转成小写

U

把U到E之间的字符转成大写

E

结束L或U转换

例子:把一级标签(<h1>...</h1>)的标题文字转换为大写

代码语言:xml复制
		<body>
		  <h1>Welcome to my Homepage</h1>
		  content is divided
		  <h2>ColdFusion</h2>
		</body>

正字表达式

(<h1>)(.*?)(</h1>)

替换

代码语言:javascript复制
	$1U$2E$3

结果

代码语言:xml复制
	<body>
	  <h1>WELCOME TO MY HOMEPAGE</h1>
	  content is divided
	  <h2>ColdFusion</h2>
	</body>

3、前后查找

<font size=4px>    前后查找的作用就是标识位置,而不在匹配结果中出现(不消费)</font>

限定符

解释

(?=)

正向前查找

(?!)

负向前查找

(?<=)

正向后查找(有些不支持)

(?<!)

负向后查找(有些不支持)

例子:找出title标签中的内容

代码语言:xml复制
	<head>
	  <title>Ben Forta's Homepage</title>
	</head>

正则:

代码语言:javascript复制
	(?<=<title>).*?(?=</title>)

结果:匹配Ben Forta's Homepage,title标签会自动去掉

4、嵌入条件

相当于在正则中加入if else,很强大但不常用

a) 回溯引用条件     例子:(123)456-9999和123-456-9999都是可接受的电话号码,前面区号要么被()括起来,要么用-隔开;      文本:     123-456-7890     (123)456-7890     (123)-456-7890     (123-456-7890     正则:

代码语言:javascript复制
  		(()?d{3}(?(1))|-)d{3}-d{4}

     结果:匹配1、2行

     解释:(()?匹配一个可选的(,我们把它用()括了起来,得到了一个表达式。           随后d{3}匹配三个数字(即123)。           (?(1))|-)是一个回溯引用,它将根据条件是否得到满足取匹配)或者-(如果(1)存在,)必须被匹配;否则-必须被匹配)

*<font color='red'><b>提示:嵌入了条件的模式看上去往往非常复杂,这意味着调试工作可能也会变得困难。我们可以先对整个模式的各个部分分别进行调试,再把它们拼装到一起。</b></font>

b) 前后查找条件(在实际工作中,往往可以用更简单的办法来达到同样的目的)      例子:匹配邮政编码,一种是12345形式,一种是123456-6789      文本:     11111      22222-      33333-4444      正则:

代码语言:javascript复制
		d{5}(?(?=-)-d{4})

    结果:匹配1、3行      解释:d{5}匹配前面的5位数字。接下来(?(?=-)-d{4})是向前查找条件。?=-匹配(但不消费)一个连字符-,如果条件满足(连字符-存在),-d{4}将匹配那个连字符和紧跟在后的4位数字。这样22222-就被排除在外了,因为它满足条件,但后面的却没有匹配。     更简单的方式:d{5}(-d{4})?

<b>总结:?后跟判别式,随后紧跟满足条件下的匹配子串,如果有不满足的子串,则紧跟在|后面。记得用()括起来</b>

四、附录

1、 表示非换行型空格(non-breaking space)

2、常见的正则表达式

a) IP地址

文本:

localhost is 127.0.0.1

正则:

代码语言:javascript复制
(((d{1,2})|(1d{2})|(2[0-4]d)|25[0-5])).){3}
((d{1,2})|(1d{2})|(2[0-4]d)|25[0-5]))

解释:

d{1,2}匹配0-99,1d{2}匹配100-199,20-4d匹配200-249,250-5匹配250-255

b) URL地址

文本:

代码语言:java复制
 http://www.baidu.com/blog
 https://www.baidu.com
 http://localhost:8500/
 http://localhost/index.html?a=1&b=32

正则:

代码语言:javascript复制
	http[s]?//[-w.] (:d )?(/([w/_.]*)?)?

结果:

第1、2、3以及第4行到?为止

c) 邮箱地址

代码语言:javascript复制
	(w .)*w @(w.) [A-Za-z] 

d) html注释

代码语言:javascript复制
	<!-{2,}.*?-{2,}>

e) 匹配中文

代码语言:javascript复制
	 [u4e00-u9fa5]

0 人点赞