Heim > Web-Frontend > js-Tutorial > Hauptteil

Eine detaillierte Einführung in die Gruppierung regulärer Javascript-Ausdrücke und -Behauptungen

黄舟
Freigeben: 2017-04-24 09:19:49
Original
1540 Leute haben es durchsucht

这篇文章主要介绍了 javascript 正则表达式分组、断言详解的相关资料,需要的朋友可以参考下

 javascript 正则表达式分组、断言详解

  提示:阅读本文需要有一定的正则表达式基础。

       正则表达式中的断言,作为高级应用出现,倒不是因为它有多难,而是概念比较抽象,不容易理解而已,今天就让小菜通俗的讲解一下。

       如果不用断言,以往用过的那些表达式,仅仅能获取到有规律的字符串,而不能获取无规律的字符串。

       举个例子,比如html源码中有xxx标签,用以前的知识,我们只能确定源码中的是固定不变的。因此,如果想获取页面标题(xxx),充其量只能写一个类似于这样的表达式:.*,而这样写匹配出来的是完整的xxx标签,并不是单纯的页面标题xxx。

       想解决以上问题,就要用到断言知识。

       在讲断言之前,读者应该先了解分组,这有助于理解断言。

       分组在正则中用()表示,根据小菜理解,分组的作用有两个:

       n  将某些规律看成是一组,然后进行组级别的重复,可以得到意想不到的效果。

       n  分组之后,可以通过后向引用简化表达式。

        先来看第一个作用,对于IP地址的匹配,简单的可以写为如下形式:

       \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
Nach dem Login kopieren

但仔细观察,我们可以发现一定的规律,可以把.\d{1,3}看成一个整体,也就是把他们看成一组,再把这个组重复3次即可。表达式如下:

       \d{1,3}(.\d{1,3}){3}
Nach dem Login kopieren

这样一看,就比较简洁了。

再来看第二个作用,就拿匹配xxx标签来说,简单的正则可以这样写:

       <title>.*</title>
Nach dem Login kopieren

可以看出,上边表达式中有两个title,完全一样,其实可以通过分组简写。表达式如下:

       <(title)>.*</\1>
Nach dem Login kopieren

这个例子实际上就是反向引用的实际应用。对于分组而言,整个表达式永远算作第0组,在本例中,第0组是<(title)>.*,然后从左到右,依次为分组编号,因此,(title)是第1组。

用\1这种语法,可以引用某组的文本内容,\1当然就是引用第1组的文本内容了,这样一来,就可以简化正则表达式,只写一次title,把它放在组里,然后在后边引用即可。

以此为启发,我们可不可以简化刚刚的IP地址正则表达式呢?原来的表达式为\d{1,3}(.\d{1,3}){3},里边的\d{1,3}重复了两次,如果利用后向引用简化,表达式如下:

       (\d{1,3})(.\1){3}
Nach dem Login kopieren

       简单的解释下,把\d{1,3}放在一组里,表示为(\d{1,3}),它是第1组,(.\1)是第2组,在第2组里通过\1语法,后向引用了第1组的文本内容。

       经过实际测试,会发现这样写是错误的,为什么呢?

       小菜一直在强调,后向引用,引用的仅仅是文本内容,而不是正则表达式!

       也就是说,组中的内容一旦匹配成功,后向引用,引用的就是匹配成功后的内容,引用的是结果,而不是表达式。

       因此,(\d{1,3})(.\1){3}这个表达式实际上匹配的是四个数都相同的IP地址,比如:123.123.123.123。

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

       接下来说说什么是断言。

Die sogenannte Behauptung soll angeben, dass eine Zeichenfolge, die ein bestimmtes Muster erfüllt, vor oder nach einer bestimmten Zeichenfolge angezeigt wird.

Nehmen Sie das Beispiel des Anfangs des Artikels . Es gibt keine Regeln, aber es wird auf jeden Fall </ im Hintergrund>, das reicht. </p> <p> Wenn Sie angeben möchten, dass <title> unbedingt vor der Angabe von xxx angezeigt wird, verwenden Sie die positiven und nachfolgenden Aussagen, den Ausdruck: (?<=<title>).*</p> <p> Nachdem angegeben wurde, dass xxx auf jeden Fall erscheint, verwenden Sie einfach die positive erste Behauptung, den Ausdruck: .*(?=)

            Addieren Sie die beiden, es ist (?< ;=)

Dies entspricht xxx.

Ich glaube, die Leser sind bereits verwirrt, nachdem sie das gesehen haben. Machen Sie sich also keine Sorgen, warten wir, bis die Beilagen langsam erklärt werden.

Tatsächlich ist es sehr einfach, wenn Sie die Regeln beherrschen. Unabhängig davon, ob es zuerst oder später gesendet wird, ist es relativ zu xxx, dh relativ zur Zielzeichenfolge.

Wenn nach der Zielzeichenfolge eine Bedingung vorliegt, kann davon ausgegangen werden, dass die Zielzeichenfolge vorne liegt. Verwenden Sie daher eine Look-Ahead-Behauptung und platzieren Sie sie nach der Zielzeichenfolge.

Wenn vor der Zielzeichenfolge eine Bedingung steht, kann davon ausgegangen werden, dass die Zielzeichenfolge danach kommt. Verwenden Sie eine Post-Assertion und platzieren Sie sie vor der Zielzeichenfolge.

Wenn eine bestimmte Bedingung erfüllt ist, ist sie positiv.

Wenn eine bestimmte Bedingung nicht erfüllt ist, ist sie negativ.

Behauptungen sind nur Bedingungen, die Ihnen helfen sollen, die Zeichenfolge zu finden, die Sie wirklich benötigen. Sie passen nicht zu sich selbst!

(?=X )

零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,/w+(?=/d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。

(?!X)

零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,/w+(?!/d) 与后不跟数字的单词匹配,而不与该数字匹配 。

(?<=X)

零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。

(?

零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?

(?=X )

Null Die Breite wird als Lookahead geltend gemacht. Der Abgleich wird nur fortgesetzt, wenn der Unterausdruck X rechts von dieser Position übereinstimmt. Beispielsweise stimmt /w+(?=/d) mit einem Wort überein, dem eine Zahl folgt, aber nicht mit der Zahl. Diese Konstruktion ist nicht rückgängig zu machen.
(?!X) Negative Lookahead-Behauptung mit der Breite Null. Setzen Sie den Abgleich nur fort, wenn der Unterausdruck X nicht rechts von dieser Position übereinstimmt. Beispielsweise stimmt /w+(?!/d) mit einem Wort überein, dem keine Zahl folgt, aber nicht die Zahl.
(?<=X) Positive Post-Behauptung mit Nullbreite. Der Abgleich wird nur fortgesetzt, wenn der Unterausdruck X links von dieser Position übereinstimmt. Beispielsweise stimmt (?<=19)99 mit Instanzen von 99 überein, die auf 19 folgen. Diese Konstruktion ist nicht rückgängig zu machen.
(? Negative Post-Behauptung mit der Breite Null. Setzen Sie den Abgleich nur dann fort, wenn der Unterausdruck X nicht links von dieser Position übereinstimmt. Beispielsweise stimmt (?
Dies ist aus der Ausdrucksform ersichtlich Bei der Behauptung Out wird die Gruppierungsnotation verwendet, aber am Anfang wird ein Fragezeichen hinzugefügt. Dieses Fragezeichen bedeutet, dass es sich um eine nicht erfassende Gruppe handelt und nicht für Rückverweise verwendet werden kann als Behauptung verwendet werden.

Das obige ist der detaillierte Inhalt vonEine detaillierte Einführung in die Gruppierung regulärer Javascript-Ausdrücke und -Behauptungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!