这篇文章主要介绍了 javascript 正则表达式分组、断言详解的相关资料,需要的朋友可以参考下
javascript 正则表达式分组、断言详解
提示:阅读本文需要有一定的正则表达式基础。
正则表达式中的断言,作为高级应用出现,倒不是因为它有多难,而是概念比较抽象,不容易理解而已,今天就让小菜通俗的讲解一下。
如果不用断言,以往用过的那些表达式,仅仅能获取到有规律的字符串,而不能获取无规律的字符串。
举个例子,比如html源码中有b2386ffb911b14667cb8f0f91ea547a7xxx6e916e0f7d1e588d4f442bf645aedb2f标签,用以前的知识,我们只能确定源码中的b2386ffb911b14667cb8f0f91ea547a7和6e916e0f7d1e588d4f442bf645aedb2f是固定不变的。因此,如果想获取页面标题(xxx),充其量只能写一个类似于这样的表达式:b2386ffb911b14667cb8f0f91ea547a7.*6e916e0f7d1e588d4f442bf645aedb2f,而这样写匹配出来的是完整的b2386ffb911b14667cb8f0f91ea547a7xxx6e916e0f7d1e588d4f442bf645aedb2f标签,并不是单纯的页面标题xxx。
想解决以上问题,就要用到断言知识。
在讲断言之前,读者应该先了解分组,这有助于理解断言。
分组在正则中用()表示,根据小菜理解,分组的作用有两个:
n 将某些规律看成是一组,然后进行组级别的重复,可以得到意想不到的效果。
n 分组之后,可以通过后向引用简化表达式。
先来看第一个作用,对于IP地址的匹配,简单的可以写为如下形式:
\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
但仔细观察,我们可以发现一定的规律,可以把.\d{1,3}看成一个整体,也就是把他们看成一组,再把这个组重复3次即可。表达式如下:
\d{1,3}(.\d{1,3}){3}
这样一看,就比较简洁了。
再来看第二个作用,就拿匹配b2386ffb911b14667cb8f0f91ea547a7xxx6e916e0f7d1e588d4f442bf645aedb2f标签来说,简单的正则可以这样写:
<title>.*</title>
可以看出,上边表达式中有两个title,完全一样,其实可以通过分组简写。表达式如下:
<(title)>.*</\1>
这个例子实际上就是反向引用的实际应用。对于分组而言,整个表达式永远算作第0组,在本例中,第0组是cc97656aee6d4c4c5fa65b10b70c0f4c.*c0f8603dd44f0db5dcc943cf687721b3,然后从左到右,依次为分组编号,因此,(title)是第1组。
用\1这种语法,可以引用某组的文本内容,\1当然就是引用第1组的文本内容了,这样一来,就可以简化正则表达式,只写一次title,把它放在组里,然后在后边引用即可。
以此为启发,我们可不可以简化刚刚的IP地址正则表达式呢?原来的表达式为\d{1,3}(.\d{1,3}){3},里边的\d{1,3}重复了两次,如果利用后向引用简化,表达式如下:
(\d{1,3})(.\1){3}
简单的解释下,把\d{1,3}放在一组里,表示为(\d{1,3}),它是第1组,(.\1)是第2组,在第2组里通过\1语法,后向引用了第1组的文本内容。
经过实际测试,会发现这样写是错误的,为什么呢?
小菜一直在强调,后向引用,引用的仅仅是文本内容,而不是正则表达式!
也就是说,组中的内容一旦匹配成功,后向引用,引用的就是匹配成功后的内容,引用的是结果,而不是表达式。
因此,(\d{1,3})(.\1){3}这个表达式实际上匹配的是四个数都相同的IP地址,比如:123.123.123.123。
至此,读者已经掌握了传说中的后向引用,就这么简单。
接下来说说什么是断言。
어설션(assertion)이란 특정 패턴을 만족하는 문자열이 특정 문자열 앞이나 뒤에 나타날 것임을 나타내는 것입니다.
xxx를 지정하기 전에 b2386ffb911b14667cb8f0f91ea547a7이 확실히 표시되도록 지정하려면 다음과 같은 긍정적인 어설션과 후속 어설션을 사용하세요.* xxx 6e916e0f7d1e588d4f442bf645aedb2f을 지정한 후 다음과 같은 긍정적인 표현을 사용하세요. .*(?=6e916e0f7d1e588d4f442bf645aedb2f) 두 개를 함께 추가하면 (?<=< ;title> ;).*(?=6e916e0f7d1e588d4f442bf645aedb2f) 이는 xxx와 일치합니다. 이 글을 보신 독자분들은 이미 헷갈리실 거라 생각하니 걱정 마시고 천천히 설명되는 반찬을 기다려주세요. 사실 규칙만 익히면 매우 간단합니다. 먼저 보내든 나중에 보내든 xxx를 기준으로, 즉 대상 문자열을 기준으로 합니다.대상 문자열 뒤에 조건이 있으면 대상 문자열이 앞에 있는 것으로 이해할 수 있으므로 Look-ahead 어설션을 사용하여 대상 문자열 뒤에 배치합니다.
대상 문자열 앞에 조건이 있으면 대상 문자열이 뒤에 오는 것으로 이해하면 post-assertion을 사용하여 대상 문자열 앞에 배치합니다.
지정된 조건이 충족되면 양성입니다.
지정된 조건을 만족하지 않을 경우 부정 처리됩니다.
어설션은 실제로 필요한 문자열을 찾는 데 도움이 되는 조건일 뿐입니다.
(?=X )
|
0 너비는 미리보기로 표시됩니다. 하위 표현식 X가 이 위치의 오른쪽과 일치하는 경우에만 일치가 계속됩니다. 예를 들어, /w+(?=/d)는 단어 뒤에 숫자가 오는 것과 일치하지만 숫자와는 일치하지 않습니다. 이 구성은 역추적되지 않습니다. |
||||||||
(?!X) | 너비가 0인 부정 예측 어설션입니다. 하위 표현식 X가 이 위치의 오른쪽과 일치하지 않는 경우에만 일치를 계속합니다. 예를 들어, /w+(?!/d)는 뒤에 숫자가 없지만 숫자가 없는 단어와 일치합니다. | ||||||||
(?<=X) | 너비가 0인 긍정 게시물 어설션. 하위 표현식 X가 이 위치의 왼쪽과 일치하는 경우에만 일치가 계속됩니다. 예를 들어 (?<=19)99는 19 뒤에 오는 99의 인스턴스와 일치합니다. 이 구성은 역추적되지 않습니다. | ||||||||
(? | 너비가 0인 부정 게시물 어설션. 하위 표현식 X가 이 위치의 왼쪽과 일치하지 않는 경우에만 일치를 계속합니다. 예를 들어 (? |
위 내용은 자바스크립트 정규식 및 어설션 그룹화에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!