ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript の正規表現とアサーションのグループ化についての詳細な紹介

JavaScript の正規表現とアサーションのグループ化についての詳細な紹介

黄舟
黄舟オリジナル
2017-04-24 09:19:491541ブラウズ

这篇文章主要介绍了 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。

       至此,读者已经掌握了传说中的后向引用,就这么简单。

       接下来说说什么是断言。

いわゆるアサーションとは、特定のパターンを満たす文字列が特定の文字列の前後に現れることを示すものです。

焦点が合っていない、私たちが望んでいるのは xxx であり、ルールはありません、ただし、前には必ず b2386ffb911b14667cb8f0f91ea547a7 があり、後ろには 6e916e0f7d1e588d4f442bf645aedb2f があれば十分です。 X xxx を指定したい場合は、& lt; title & gt; を使用して、式 (? & Lt; = & lt; title & gt;) を使用します。肯定先読みアサーション、式: .*(?=6e916e0f7d1e588d4f442bf645aedb2f) 2つを足すと (? ) になります

このようにして、xxx​​ と一致させることができます。

これを見て読者の皆さんも混乱していると思いますので、安心しておかずの説明をゆっくり待ちましょう。

実際、ルールをマスターすれば、最初に送信するか後から送信するかに関係なく、xxx を基準とする、つまりターゲット文字列を基準とするのは非常に簡単です。文字 対象文字列が条件付きの場合、対象文字列が前にあるものとして認識し、その存在を利用して対象文字列の後ろにあるように見せかけることができます。

対象文字列の前に条件がある場合、対象文字列が後であることがわかるので、ポストアサーションを利用して対象文字列の前に置きます。

ある条件を満たせば陽性となります。

ある条件を満たさないとマイナスとなります。

アサーションは、本当に必要な文字列を見つけるための単なる条件です。アサーション自体は一致しません。

(?=X )

ゼロ幅の正の先読みアサーション。部分式 X がこの位置の右側に一致する場合にのみ、一致が続行されます。たとえば、/w+(?=/d) は、数字の後に続く単語には一致しますが、数字には一致しません。この構造は後戻りしません。

(?!X)

ゼロ幅の否定先読みアサーション。部分式 X がこの位置の右側に一致しない場合にのみ、一致を続けます。たとえば、/w+(?!/d) は、数字が続かない単語には一致しますが、数字には一致しません。

(?<=X)

ゼロ幅のポジティブポストアサーション。部分式 X がこの位置の左側に一致する場合にのみ、一致が続行されます。たとえば、(?<=19)99 は、19 に続く 99 のインスタンスと一致します。この構造は後戻りしません。

(?

ゼロ幅の否定的なポストアサーション。部分式 X がこの位置の左側に一致しない場合にのみ、一致を続けます。たとえば、(?

アサーションの表現形式から、グループ化記号を使用していることがわかりますが、先頭に a が追加されています疑問符。この疑問符は、このグループが番号を持たず、アサーションとしてのみ使用できることを意味します。

以上がJavaScript の正規表現とアサーションのグループ化についての詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。