Heim  >  Artikel  >  Web-Frontend  >  Informationen zur Verwendung von RegExp-Objekten und Klammern in regulären JS-Ausdrücken

Informationen zur Verwendung von RegExp-Objekten und Klammern in regulären JS-Ausdrücken

不言
不言Original
2018-06-30 13:49:571585Durchsuche

Das Folgende ist eine kurze Diskussion über die Verwendung von RegExp-Objekten und Klammern in regulären JS-Ausdrücken. Der Inhalt ist ziemlich gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz verwenden.

Erstellung des RegExp-Objekts:

Herkömmliche reguläre Ausdrücke können mit direkten Mengen erstellt werden, also mit Zeichen, die von Schrägstrichen „/“ umschlossen sind. Aber in Umgebungen, die Parameteränderungen erfordern, ist der RegExp()-Konstruktor die bessere Wahl:

var reg1 = /'w+'/g;
var reg2 = new RegExp('' \w+ '','g');

Beim Vergleich der beiden Erstellungsmethoden ist der erste Parameter in RegExp die zu erstellende reguläre Zeichenfolge. Achten Sie einerseits darauf, da dies nicht der Fall ist Da es sich um eine direkte Darstellung handelt, ist es nicht erforderlich, sie mit Schrägstrichen „/“ einzuschließen. Stattdessen müssen die Anführungszeichen „‘“ und das Escape-Symbol „ “ zweimal mit Escapezeichen versehen werden.

Außerdem wird unabhängig davon, ob es sich um eine direkte Variable oder den RegExp()-Konstruktor handelt, ein neues RegExp-Objekt generiert und einer Variablen zugewiesen.

Ähnlichkeiten und Unterschiede zwischen match() und exec():

Match und exec sind gängige Methoden zum Abgleichen von Zeichenfolgen mit regulären Ausdrücken. Die von den beiden implementierten Funktionen sind ähnlich, mit einigen subtilen Unterschieden:

1. Verwendung

match ist eine Methode zum Verpacken von Zeichenfolgen. Verwendung: String.match(RegExp);

exec ist eine Methode eines regulären Ausdrucksobjekts, Verwendung: RegExp.exec(String);

2 🎜>

Wenn RegExp das globale Flag „g“ nicht setzt:

Die Rückgabeergebnisse beider sind gleich. Das heißt, null wird zurückgegeben, wenn kein passender Wert vorhanden ist, und ein Array (let array) wird zurückgegeben, wenn ein passender Wert vorhanden ist. array[0] ist die passende Zeichenfolge, array[1], array[2]... entsprechen den Teilzeichenfolgen $1, $2..., die durch Klammern im regulären Ausdruck übereinstimmen. Gleichzeitig verfügt das Array über zwei Attribute: array.index repräsentiert die Anfangsposition der passenden Zeichenfolge und array.input repräsentiert die abzurufende Zeichenfolge.

Wenn bei RegExp das globale Flag „g“ gesetzt ist:

match gibt ein Array zurück, wenn ein Wert vorhanden ist. Jedes Element im Array repräsentiert nacheinander alle übereinstimmenden Zeichenfolgen, sodass keine weiteren durch Klammern übereinstimmenden Teilzeichenfolgen vorhanden sind. Zu diesem Zeitpunkt verfügt das Array über kein Indexattribut und kein Eingabeattribut.

exec verhält sich genauso wie ohne das globale Flag „g“. Was zu diesem Zeitpunkt zurückgegeben wird, ist ein Array-Array, Array[0] ist die aktuell übereinstimmende Zeichenfolge, Array[1], Array[2]...sind die Zeichenfolgen, mit denen die Klammern unter der aktuellen Übereinstimmung übereinstimmen. Zu diesem Zeitpunkt sollten Sie auf das lastIndex-Attribut des RegExp-Objekts achten, das die Position nach dem Ende der übereinstimmenden Zeichenfolge in der Originalzeichenfolge darstellt. Wenn keine weiteren passenden Ergebnisse vorliegen, wird das lastIndex-Attribut auf 0 gesetzt. Daher können Sie die lastIndex-Schleife verwenden, um alle passenden Zeichenfolgen zu finden.


Unterstützt mehrere Matching-Methoden:

JS-Code

var testStr = "now test001 test002";  
var re = /test(\d+)/ig;  
var r = "";  
while(r = re.exec(testStr)) {  
  alert(r[0] + " " + r[1]);  
}

Darüber hinaus können Sie auch testStr.match(re) verwenden, aber in diesem Fall können Sie nicht die g-Option haben, sondern nur die erstes Spiel.

1. Regeln für reguläre Ausdrücke

1.1 Gewöhnliche Zeichen

Buchstaben, Zahlen, chinesische Schriftzeichen, Unterstriche und Satzzeichen, die in den folgenden Kapiteln nicht speziell definiert werden, sind alle „normale Zeichen“. Gewöhnliche Zeichen in einem Ausdruck stimmen beim Abgleich mit einer Zeichenfolge mit demselben Zeichen überein.

Beispiel 1: Der Ausdruck „c“ lautet beim Abgleichen der Zeichenfolge „abcde“: Erfolg; der abgeglichene Inhalt lautet: „c“; die abgeglichene Position lautet: beginnend bei 2, beendet um 3. (Hinweis: Ob der Index bei 0 oder 1 beginnt, kann je nach aktueller Programmiersprache unterschiedlich sein)

Beispiel 2: Der Ausdruck „bcd“ lautet beim Abgleich mit der Zeichenfolge „abcde“ das Übereinstimmungsergebnis: Erfolgreich; Der übereinstimmende Inhalt ist: „bcd“; die übereinstimmende Position ist: beginnend bei 1 und endend bei 4.

1.2 Einfache Escape-Zeichen

Für einige Zeichen, die sich schwer schreiben lassen, fügen Sie „/“ voran. Tatsächlich sind wir alle mit diesen Charakteren vertraut.

Ausdruck

Kann übereinstimmen

表达式

可匹配

/r, /n

代表回车和换行符

/t

制表符

//

代表 "/" 本身

/r, / n

Stellt Wagenrücklauf- und Zeilenvorschubzeichen dar

/t

Tab

//

Stellt „/“ selbst dar

Es gibt weitere Satzzeichen, die in späteren Kapiteln speziell verwendet werden. Das Hinzufügen von „/“ davor stellt das Symbol selbst dar. Beispiel: ^ und $ haben eine besondere Bedeutung. Wenn Sie die Zeichen „^“ und „$“ in der Zeichenfolge anpassen möchten, muss der Ausdruck als „/^“ und „/$“ geschrieben werden.

表达式

可匹配

/^

匹配 ^ 符号本身

/$

匹配 $ 符号本身

/.

匹配小数点(.)本身

Ausdruck

kann mit

/^

Entspricht dem ^-Symbol selbst

/$

Entspricht dem $-Symbol selbst

表达式

可匹配

/d

任意一个数字,0~9 中的任意一个

/w

任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个

/s

包括空格、制表符、换页符等空白字符的其中任意一个

.

小数点可以匹配除了换行符(/n)以外的任意一个字符

/ .

Passen Sie den Dezimalpunkt (.) selbst an

Die Matching-Methode dieser Escapezeichen Zeichen ist dasselbe wie „Gewöhnliche Zeichen“ sind ähnlich. Entspricht auch demselben Zeichen.

Beispiel 1: Wenn der Ausdruck „/$d“ mit der Zeichenfolge „abc$de“ übereinstimmt, ist das übereinstimmende Ergebnis: „$d“; die übereinstimmende Position ist: Beginnt bei 3 und endet um 5.

1.3 Ausdrücke, die mit „mehreren Zeichen“ übereinstimmen können

表达式

可匹配

[ab5@]

匹配 "a" 或 "b" 或 "5" 或 "@"

[^abc]

匹配 "a","b","c" 之外的任意一个字符

[f-k]

匹配 "f"~"k" 之间的任意一个字母

[^A-F0-3]

匹配 "A"~"F","0"~"3" 之外的任意一个字符

Einige Ausdrucksmethoden in regulären Ausdrücken können mit jedem der „mehreren Zeichen“ übereinstimmen. Beispielsweise kann der Ausdruck „/d“ mit einer beliebigen Zahl übereinstimmen. Obwohl es mit jedem der Zeichen übereinstimmen kann, kann es nur eines sein, nicht mehrere. Das ist wie beim Pokern. Der König und der König können jede Karte ersetzen, aber sie können nur eine Karte ersetzen.
Ausdruck kann mit
/d Jede Zahl, jede von 0~9
/w Jeder Buchstabe, jede Zahl oder jeder Unterstrich, d. h. A~Z,a~z,0 Jeder von ihnen ~9,_
/s enthält Leerzeichen, Tabulatoren und Ersetzungszeichen. Jedes davon die Leerzeichen wie Seitenumbrüche
. Der Dezimalpunkt kann mit Ausnahme des Zeilenumbruchzeichens übereinstimmen ( /n) Jedes andere Zeichen als
Beispiel 1: Der Ausdruck „/d/d“ stimmt bei Übereinstimmung mit „abc123“ mit The überein Ergebnis ist: Erfolg; der übereinstimmende Inhalt ist: „12“; die übereinstimmende Position ist: beginnend bei 3 und endend bei 5. Beispiel 2: Wenn der Ausdruck „a./d“ mit „aaa100“ übereinstimmt, ist das übereinstimmende Ergebnis: „aa1“; die übereinstimmende Position ist: beginnend bei 1, beendet in 4. 1.4 Benutzerdefinierte Ausdrücke, die mit „mehreren Zeichen“ übereinstimmen können Verwenden Sie eckige Klammern [ ], um eine Reihe von Zeichen einzuschließen, die mit jedem dieser Zeichen übereinstimmen können. Verwenden Sie [^], um eine Reihe von Zeichen einzuschließen, die mit jedem Zeichen außer den Zeichen dazwischen übereinstimmen. Auf die gleiche Weise kann es zwar zu jedem von ihnen passen, es kann jedoch nur einer und nicht mehrere sein.
Ausdruck kann mit
[ab5@] Entspricht „a“ oder „b“ oder „5“ oder „ @"
[^abc] Entspricht „a“, „b“, „Any“. anderes Zeichen als c“
[f-k] entspricht „f“~“ k“ entspricht Jeder Buchstabe zwischen
[^A-F0-3] Jedes andere Zeichen als „A "~"F","0"~"3"

Beispiel 1: Wenn der Ausdruck „[bcd][bcd]“ mit „abc123“ übereinstimmt, ist das Übereinstimmungsergebnis: „Erfolg“; die übereinstimmende Position ist: beginnend bei 1 und endend bei 3 .

Beispiel 2: Wenn der Ausdruck „[^abc]“ mit „abc123“ übereinstimmt, ist das übereinstimmende Ergebnis: „Erfolg“; die übereinstimmende Position ist: beginnend bei 3, beendet um 4.

1.5 Spezielle Symbole, die die Anzahl der Übereinstimmungen ändern

Die in den vorherigen Kapiteln erwähnten Ausdrücke, unabhängig davon, ob sie nur einem Zeichentyp oder mehreren entsprechen können Ein Ausdruck, der eines dieser Zeichen enthält, kann nur einmal gefunden werden. Wenn Sie einen Ausdruck und ein spezielles Symbol verwenden, das die Anzahl der Übereinstimmungen ändert, können Sie wiederholt Übereinstimmungen erzielen, ohne den Ausdruck erneut schreiben zu müssen.

Die Verwendungsmethode ist: Geben Sie die „Anzahl der Modifikationen“ nach dem „geänderten Ausdruck“ ein. Beispiel: „[bcd][bcd]“ kann als „[bcd]{2}“ geschrieben werden.

表达式

作用

{n}

表达式重复n次,比如:"/w{2}" 相当于 "/w/w";"a{5}" 相当于 "aaaaa"

{m,n}

表达式至少重复m次,最多重复n次,比如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"

{m,}

表达式至少重复m次,比如:"/w/d{2,}"可以匹配 "a12","_456","M12344"...

?

匹配表达式0次或者1次,相当于 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"

+

表达式至少出现1次,相当于 {1,},比如:"a+b"可以匹配 "ab","aab","aaab"...

*

表达式不出现或出现任意次,相当于 {0,},比如:"/^*b"可以匹配 "b","^^^b"...

Ausdruck

Funktion

{n}

Der Ausdruck wird n-mal wiederholt, zum Beispiel: „/w{2} " Entspricht „/w/w“; „a{5}“ entspricht „aaaaa“
{m,n}

td>

Der Ausdruck wird mindestens m-mal und höchstens n-mal wiederholt. Beispiel: „ba{1,3}“ kann mit „ba“ oder „baa“ oder „baaa“ übereinstimmen

表达式

作用

^

与字符串开始的地方匹配,不匹配任何字符

$

与字符串结束的地方匹配,不匹配任何字符

/b

匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符

{m,} Der Ausdruck wird mindestens m-mal wiederholt, zum Beispiel: „/w /d{2,}“ kann mit „a12“, „_456“, „M12344“ übereinstimmen...
? match Der Ausdruck ist 0 oder 1 Mal, entspricht {0,1}, zum Beispiel: „a[cd]?“ kann mit „a“, „ac“, „ad“ übereinstimmen
+ Der Ausdruck erscheint mindestens einmal, äquivalent zu {1,}, zum Beispiel: „a +b“ kann mit „ab“, „aab“, „aaab“ übereinstimmen...
* Der Ausdruck erscheint nicht oder erscheint zufällig oft, äquivalent zu {0,}, zum Beispiel: „/^*b“ kann mit „b“, „^^^b“ übereinstimmen...
Beispiel 1: Wenn der Ausdruck „/d+/.?/d*“ mit „Es kostet 12,5 $“ übereinstimmt, lautet das Übereinstimmungsergebnis: Erfolg; der übereinstimmende Inhalt ist : „12,5“; die übereinstimmende Position ist: Beginnt bei 10 und endet bei 14. Beispiel 2: Wenn der Ausdruck „go{2,8}gle“ mit „Ads by goooooogle“ übereinstimmt, lautet das Übereinstimmungsergebnis: „goooooogle“; die übereinstimmende Position „Ja: beginnt“. um 7 Uhr und endet um 17 Uhr. 1.6 Einige andere Sondersymbole, die abstrakte Bedeutungen darstellenEinige Symbole stellen abstrakte Sonderbedeutungen in Ausdrücken dar:

Weitere Texterklärungen sind noch relativ abstrakt, daher werden Beispiele bereitgestellt, um das Verständnis für alle zu erleichtern.

Beispiel 1: Wenn der Ausdruck „^aaa“ mit „xxx aaa xxx“ übereinstimmt, lautet das Übereinstimmungsergebnis: Fehler. Da „^“ erforderlich ist, um mit dem Anfang der Zeichenfolge übereinzustimmen, kann „^aaa“ nur übereinstimmen, wenn „aaa“ am Anfang der Zeichenfolge steht, z. B. „aaa xxx xxx“.

Beispiel 2: Wenn der Ausdruck „aaa$“ mit „xxx aaa xxx“ übereinstimmt, lautet das Übereinstimmungsergebnis: Fehler. Da „$“ erforderlich ist, um mit dem Ende der Zeichenfolge übereinzustimmen, kann „aaa$“ nur übereinstimmen, wenn „aaa“ am Ende der Zeichenfolge steht, z. B.: „xxx xxx aaa“.

Beispiel 3: Wenn der Ausdruck „./b.“ mit „@@@abc“ übereinstimmt, ist das übereinstimmende Ergebnis: „@a“; die übereinstimmende Position ist: Beginnt bei 2 und endet um 4.
Weitere Erklärung: „/b“ ähnelt „^“ und „$“. Es entspricht keinem Zeichen selbst, erfordert jedoch, dass es sich im Übereinstimmungsergebnis links und rechts von der Position befindet Davon ist der „/w“-Bereich. Die andere Seite ist der Nicht-„/w“-Bereich.

Beispiel 4: Wenn der Ausdruck „/bend/b“ mit „weekend,endfor,end“ übereinstimmt, ist das übereinstimmende Ergebnis: success; die übereinstimmende Position ist: Beginnt bei 15 und endet um 18.

Einige Symbole können die Beziehung zwischen Unterausdrücken innerhalb eines Ausdrucks beeinflussen:

Ausdruck Funktion ^ entspricht dem Anfang der Zeichenfolge und entspricht keinem Zeichen
$ entspricht dem Ende der Zeichenfolge und entspricht keinem Zeichen
/b entspricht einer Wortgrenze, also der Position zwischen einem Wort und einem Leerzeichen, und stimmt mit keinem Zeichen überein

表达式

作用

|

左右两边表达式之间 "或" 关系,匹配左边或者右边

( )

(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
     (2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到

Ausdruck

Funktion

|

Die „ODER“-Beziehung zwischen den linken und rechten Ausdrücken, passend zur linken oder rechten Seite

( ) (1) Wenn die Anzahl der Übereinstimmungen geändert wird, kann der Ausdruck in Klammern als Ganzes geändert werden (2) Beim Abrufen der Übereinstimmungsergebnisse kann der mit dem Ausdruck in Klammern übereinstimmende Inhalt einzeln abgerufen werden

Beispiel 5: Ausdruck Wenn „ „Tom|Jack“ entspricht der Zeichenfolge „Ich bin Tom, er ist Jack“, das Übereinstimmungsergebnis ist: Erfolg; der übereinstimmende Inhalt ist: „Tom“; die übereinstimmende Position ist: beginnend bei 4 und endend bei 7 . Beim nächsten Abgleich lautet das Abgleichsergebnis: „Jack“; die abgeglichene Position beginnt bei 15 und endet bei 19. Beispiel 6: Wenn der Ausdruck „(go/s*)+“ mit „Let's go go go!“ übereinstimmt, ist das Übereinstimmungsergebnis: success; der übereinstimmende Inhalt ist: „go go go“; Die Positionen beginnen bei 6 und enden bei 14.

Beispiel 7: Wenn der Ausdruck „¥(/d+/.?/d*)“ mit „$10,9,¥20,5“ übereinstimmt, ist das Übereinstimmungsergebnis: Erfolg; der übereinstimmende Inhalt ist: „¥ 20,5“ ; die übereinstimmende Position ist: beginnend bei 6 und endend bei 10. Der allein durch die Ermittlung des Klammerbereichs ermittelte Inhalt lautet: „20,5“.

表达式

匹配结果

(d)(/w+)

"/w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"

(d)(/w+)(d)

"/w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "/w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"/w+" 可以 "让出" 它本来能够匹配的最后一个 "d"

2. Einige erweiterte Regeln in regulären Ausdrücken2.1 Gierig und nicht gierig in der Anzahl der Übereinstimmungen Bei der Verwendung spezieller Symbole, die die Anzahl der Übereinstimmungen ändern, gibt es mehrere Darstellungsmethoden, die dafür sorgen können, dass derselbe Ausdruck zu unterschiedlichen Zeiten übereinstimmt, wie zum Beispiel: „{m,n}“, „{m,}“, „ ?", „*“, „+“, die spezifische Anzahl der Übereinstimmungen hängt von der übereinstimmenden Zeichenfolge ab. Diese Art von wiederholtem Matching-Ausdruck mit unbegrenzter Häufigkeit stimmt während des Matching-Prozesses immer so oft wie möglich überein. Für den Text „dxxxdxxxd“ lautet das Beispiel beispielsweise wie folgt: "/w+" findet alle Zeichen nach dem ersten „d“ „xxxdxxxd“
Expression Übereinstimmende Ergebnisse
(d)(/w+)
(d)(/w+)( d) "/w+" findet alle Zeichen „xxxdxxx“ zwischen dem ersten „d“ und dem letzten „d“. Obwohl „/w+“ auch mit dem letzten „d“ übereinstimmen kann, damit der gesamte Ausdruck erfolgreich übereinstimmt, kann „/w+“ das letzte „d“ „aufgeben“, mit dem es hätte übereinstimmen können

Es ist ersichtlich, dass „/w+“ beim Abgleich immer mit so vielen Zeichen wie möglich übereinstimmt, die seinen Regeln entsprechen. Obwohl es im zweiten Beispiel nicht mit dem letzten „d“ übereinstimmt, kann der gesamte Ausdruck erfolgreich abgeglichen werden. Auf die gleiche Weise werden Ausdrücke mit „*“ und „{m,n}“ so weit wie möglich abgeglichen, und Ausdrücke mit „?“ werden auch so weit wie möglich „abgeglichen“, wenn sie übereinstimmen können oder nicht. Dieses Matching-Prinzip wird als „Greedy“-Modus bezeichnet.

Nicht-gieriger Modus:

Fügen Sie nach dem Sonderzeichen ein „?“-Zeichen hinzu, das die Anzahl der Übereinstimmungen ändert, sodass der Ausdruck eine unbestimmte Anzahl von Übereinstimmungen aufweist kann so klein wie möglich gemacht werden Weniger Übereinstimmungen, sodass Ausdrücke, die übereinstimmen oder nicht übereinstimmen können, so weit wie möglich „nicht übereinstimmend“ sein können. Dieses Matching-Prinzip wird als „nicht gieriger“ Modus oder auch als „widerwilliger“ Modus bezeichnet. Wenn es weniger Übereinstimmungen gibt, wird der gesamte Ausdruck nicht übereinstimmen. Ähnlich wie im Greedy-Modus werden im Non-Greedy-Modus minimal mehr Übereinstimmungen erzielt, damit der gesamte Ausdruck erfolgreich übereinstimmt. Zum Beispiel für den Text „dxxxdxxxd“:

表达式

匹配结果

(d)(/w+?)

"/w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"/w+?" 只匹配了一个 "x"

(d)(/w+?)(d)

为了让整个表达式匹配成功,"/w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"/w+?" 匹配 "xxx"

Expression td >
Übereinstimmende Ergebnisse
(d)(/w+?) „/w+?“ entspricht möglichst wenigen Zeichen nach dem ersten „d“. Das Ergebnis ist: „/w+?“ entspricht nur einem „x“
(d)(/w+?)(d) Damit der gesamte Ausdruck erfolgreich übereinstimmt, muss „/w+?“ Nur mit „xxx“ übereinstimmen Dann kann das folgende „d“ übereinstimmen, sodass der gesamte Ausdruck erfolgreich übereinstimmt. Daher lautet das Ergebnis: „/w+?“ entspricht „xxx“

Weitere Situationen, Beispiele sind wie folgt:

Beispiel 1: Ausdruck „b6c5a531a458a2e790c1fd6421739d1c(.*)b90dd5946f0946207856a8a37f441edf“ und Zeichenfolge „b6c5a531a458a2e790c1fd6421739d1ce388a4556c0f65e1904146cc1a846beeaa< ;/ p>b90dd5946f0946207856a8a37f441edf b6c5a531a458a2e790c1fd6421739d1ce388a4556c0f65e1904146cc1a846beebb94b3e26ee717c64999d7867364b1b4a3b90dd5946f0946207856a8a37f441edf“ Beim Abgleich ist das Abgleichergebnis: Erfolg; der abgeglichene Inhalt ist „b6c5a531a458a2e790c1fd6421739d1c6966594b081896546b708374d016ff98b90dd5946f0946207856a8a37f441edf b6c5a531a458a2e790c1fd6421739d1ce388a4556c0f65e1904146cc1a846beebb94b3e26ee717c64999d7867364b1b4a3b90dd5946f0946207856a8a37f441edf“ ist das „b90dd5946f0946207856a8a37f441edf“ im Ausdruck dasselbe wie die Zeichenfolge Die letzten „b90dd5946f0946207856a8a37f441edf“-Übereinstimmungen.

Beispiel 2: Wenn dagegen der Ausdruck „b6c5a531a458a2e790c1fd6421739d1c(.*?)b90dd5946f0946207856a8a37f441edf“ mit der gleichen Zeichenfolge wie in Beispiel 1 übereinstimmt, wird nur „b6c5a531a458a2e790c1fd6421739d1c“ erhalten e388a4556c0f65e1904146cc1a846beeaa94b3e26ee717c64999d7867364b1b4a3b90dd5946f0946207856a8a37f441edf“, wenn Sie das nächste erneut abgleichen, können Sie das zweite „b6c5a531a458a2e790c1fd6421739d1ce388a4556c0f65e1904146cc1a846beebb94b3e26ee717c64999d7867364b1b4a3b90dd5946f0946207856a8a37f441edf“ erhalten.

2.2 Rückverweis /1, /2...

Beim Abgleichen eines Ausdrucks stimmt die Ausdrucks-Engine mit dem in Klammern „( )“ enthaltenen Ausdruck überein. Zeichnen Sie die Zeichenfolge auf mit der Formel übereinstimmt. Beim Abrufen des Übereinstimmungsergebnisses kann die Zeichenfolge, die mit dem in Klammern enthaltenen Ausdruck übereinstimmt, separat abgerufen werden. Dies wurde in den vorherigen Beispielen mehrfach demonstriert. Wenn in praktischen Anwendungen eine bestimmte Grenze für die Suche verwendet wird und der abzurufende Inhalt diese Grenze nicht enthält, müssen Klammern verwendet werden, um den gewünschten Bereich anzugeben. Zum Beispiel das vorherige „b6c5a531a458a2e790c1fd6421739d1c(.*?)b90dd5946f0946207856a8a37f441edf“.

Tatsächlich kann „die Zeichenfolge, die mit dem in Klammern enthaltenen Ausdruck übereinstimmt“ nicht nur nach Abschluss des Abgleichs, sondern auch während des Abgleichvorgangs verwendet werden. Der Teil nach dem Ausdruck kann auf den vorherigen „Untertreffer in Klammern, der bereits mit der Zeichenfolge übereinstimmt“ verweisen. Die Referenzmethode ist „/“ plus eine Zahl. „/1“ bezieht sich auf die im ersten Klammerpaar übereinstimmende Zeichenfolge, „/2“ bezieht sich auf die im zweiten Klammerpaar übereinstimmende Zeichenfolge ... und so weiter. Wenn ein Klammerpaar ein weiteres Klammerpaar enthält, dann Das äußere Paar Die Klammern der Ebene werden zuerst sortiert. Mit anderen Worten, welches Paar linker Klammern „(“ kommt zuerst, dann wird dieses Paar zuerst sortiert.

Zum Beispiel:

Beispiel 1: Ausdruck „('|“ )(. *?)(/1)“ Beim Abgleichen von „‚Hallo‘, „Welt““ ist das Übereinstimmungsergebnis: Erfolg; der übereinstimmende Inhalt ist: „‚Hallo‘“. Wenn der nächste erneut abgeglichen wird, kann er mit „ „Welt“ „.

Beispiel 2: Wenn der Ausdruck „(/w)/1{4,}“ mit „aa bbbb abcdefg ccccc 111121111 999999999“ übereinstimmt, lautet das Übereinstimmungsergebnis: success; matched Der Inhalt ist „ccccc“. Bei einem erneuten Abgleich wird 999999999 erhalten. Dieser Ausdruck erfordert, dass die Zeichen im Bereich „/w“ mindestens fünfmal wiederholt werden Beispiel 3: Ausdruck „aa2805d75ba5219c9a05a3e955127d01.*?79dbac2cf7823004ee7131a4985900bf“ Beim Matching „4808fab9427a7febf207b1aac0db53a6b90dd5946f0946207856a8a37f441edf“, das Matching-Ergebnis ist erfolgreich. Wenn „b6c5a531a458a2e790c1fd6421739d1c“ und „b90dd5946f0946207856a8a37f441edf“ nicht übereinstimmen, Die Übereinstimmung schlägt fehl. Wenn auf andere Übereinstimmungen umgestellt wird, kann die Übereinstimmung auch erfolgreich sein.

2.3 Vorabsuche, keine Übereinstimmung, keine Übereinstimmung >Im vorherigen Kapitel habe ich über mehrere Sonderzeichen gesprochen, die abstrakte Bedeutungen darstellen: „^“, „$“ und „/b“. Sie alle haben eines gemeinsam: Sie stimmen mit keinem Zeichen überein. Eine Bedingung wird an „beide Enden der Zeichenfolge“ oder „die Lücke zwischen den Zeichen“ angehängt. Nachdem wir dieses Konzept verstanden haben, wird in diesem Abschnitt ein weiterer, flexiblerer Ausdruck vorgestellt, der Bedingungen an „beide Enden“ oder „die Lücke“ anhängt. Methode.

Vorwärtssuche: „(?=xxxxx)“, „(?!xxxxx)“

Format: „(?=xxxxx)“, in der übereinstimmenden Zeichenfolge Die Bedingung, die es an die „Lücke“ oder „beide Enden“ anhängt, ist: Die rechte Seite der Lücke muss mit dem Ausdruck von xxxxx übereinstimmen, da sie nur als zusätzliche Bedingung für diese Lücke verwendet wird. Sie hat keinen Einfluss auf die nachfolgenden Ausdrücke Um die Zeichen nach dieser Lücke tatsächlich abzugleichen, ähnelt dies dem Zeichen „/b“, das nur die Zeichen vor und nach der Lücke berücksichtigt und keinen Einfluss auf die nachfolgenden Ausdrücke hat Übereinstimmung.

Beispiel 1: Wenn der Ausdruck „Windows (?=NT|XP)“ mit „Windows 98, Windows NT, Windows 2000“ übereinstimmt, stimmt er nur mit „Windows“ in „Windows NT“ überein. , und andere „Windows“-Wörter werden nicht gefunden.

Beispiel 2: Der Ausdruck „(/w)((?=/1/1/1)(/1))+“ entspricht 6 „f“, wenn er mit der Zeichenfolge „aaa ffffff 999999999“ übereinstimmt. Die ersten 4 von , kann mit den ersten 7 von 9 „9“ übereinstimmen. Dieser Ausdruck kann wie folgt gelesen werden: Wenn Buchstaben und Zahlen mehr als viermal wiederholt werden, stimmt der Teil vor den letzten beiden Ziffern überein. Natürlich muss dieser Ausdruck nicht so geschrieben werden, sondern dient nur zu Demonstrationszwecken.

Format: „(?!xxxxx)“ befindet sich auf der rechten Seite der Lücke und darf nicht mit dem xxxxx-Teil des Ausdrucks übereinstimmen.

Beispiel 3: Wenn der Ausdruck „((?!/bstop/b).)+“ mit „fdjka ljfdl stop fjdsla fdj“ übereinstimmt, wird er vom Anfang bis zur Position vor „stop If“ abgeglichen das Zeichen Wenn in der Zeichenfolge kein „Stop“ vorhanden ist, wird die gesamte Zeichenfolge abgeglichen.

Beispiel 4: Wenn der Ausdruck „do(?!/w)“ mit der Zeichenfolge „done, do, dog“ übereinstimmt, kann er nur mit „do“ übereinstimmen. In diesem Beispiel hat die Verwendung von „(?!/w)“ nach „do“ den gleichen Effekt wie die Verwendung von „/b“.

Rückwärts-Vorabsuche: „(?49ec0b0bf2ca0ee69fc89123d797cece/: wird in vielen Programmiersprachen als Escape-Zeichen verwendet, wenn auf das Symbol
/ It folgt ist das gewöhnliche Zeichen c, dann stellt /c eine besondere Bedeutung dar. Beispielsweise stellt n ursprünglich das Zeichen n dar, aber /n repräsentiert eine neue Zeile. Wenn auf das Symbol
/ das Sonderzeichen c folgt, stellt /c das gewöhnliche Zeichen c dar. Beispielsweise wird / im Allgemeinen als Escape-Zeichen verwendet, // stellt jedoch das gewöhnliche Zeichen / dar.
Die Verwendung von / in regulären Ausdrücken in Javascript ist die gleiche wie oben, mit der Ausnahme, dass die Sonderzeichentabellen in verschiedenen Programmiersprachen unterschiedlich sein können.

2>^:匹配输入字符串的起始端,如果是多行匹配,即表达式的附加参数中含有m,则也在一个换行符后匹配。
例子:
/^B/匹配 “Bab Bc ”中的第一个B

例子2:
/^B/gm匹配
“Badd B
cdaf
B dsfB”

中的第一行第一个B,第三行中的第一个B
         
3>$:匹配输入字符创的尾端,如果是多行匹配,即表达式的附加参数中含有m,则也在一个换行符前匹配。

与^的用法相反。

例子:/t$/匹配“bat”中的t,但是不匹配“hate”中的t

例子2:/t$/匹配

“tag at
bat”
中第一行的最后一个t和第二行的t。

4>*:匹配前一个字符0次或多次。

例子:/ab*/匹配“dddabbbbc”中的“abbbb”,也匹配“ddda”中的“a”

5>+:匹配前一个字符1次或多次。

例子:/ab+/匹配“dddabbbbc”中的“abbbb”,但不匹配“ddda”

与后面的{1,}(原型:{n,})的用法类似

6>?:?的用法比较特殊,一般来说它用来对前一个字符做0次或1次匹配,但是它有另外两种特殊的用法:

如果紧跟在*、+、?和{ }之后,则表示原始匹配的最小次数匹配,例如:
/ba*/本来匹配“bbbaaaa”中的“baaaa”,但是/ba*?/则匹配“bbbaaaa”中的“b”(因为*表示0次或多次匹配,而加?应该表示最少次数匹配,即0次匹配)。
同理:/ba+?/则匹配“baaaa”中的“ba”。
作为语法结构符号,使用于前置断言中,即后面要说到的x(?=y)和x(?!=y)

7>.:小数点中的“.”号,匹配任何一个单独的字符,但是换行符除外。

标准中总共有哪些字符?请参考:字符集
例如:/a.b/匹配“acbaa”中的“acb”,但是不匹配“abbb”。

8>(x):表示匹配x(并非特指字符x或者特指一个字符,x表示一个字符串),而且匹配会被记住,在语法中这种()被称为“capturing parentheses ”,即捕捉用的小括号。

匹配会被记住,是因为在表达式提供的函数中,有些函数返回一个数组,该数组会保存所匹配的所有字符串,例如exec()函数。
另外还要注意()中的x被记住的前提是匹配x。

例子1:

var regx=/a(b)c/;
var rs=regx.exec(“abcddd”);

从上面可以看出,/a(b)c/匹配“abcddd”中的“abc”,因为()的原因,b也会记录下来,因此rs返回的数字内容为:
{abc,b}

例子2:

var regx=/a(b)c/;
var rs=regx.exec(“acbcddd”);

rs返回null,因为/a(b)c/不匹配“acbcddd”,所以()中的b不会被记录下来(尽管字符串中含有b)

9>(?:x):匹配x,但不会记住x,这种格式中的()被称为“non-capturing parentheses ”,即非捕捉用的小括号。

例子:

var regx=/a(?:b)c/;
var rs=regx.exec(“abcddd”);

从上面可以看出,/a(?:b)c/匹配“abcddd”中的“abc”,因为(?:)的原因,b不会记录下来,因此rs返回的数字内容为:
{abc}

10>X(?=y):匹配x,仅当后面紧跟着y时。如果符合匹配,则只有x会被记住,y不会被记住。

例子:

var regx=/user(?=name)/;
var rs=regx.exec(“The username is Mary”);

结果:匹配成功,而且rs的值为{user}

11>X(?!y):匹配x,仅当后面不紧跟着y时。如果符合匹配,则只有x会被记住,y不会被记住。

例子:

var regx=/user(?!name)/;
var rs=regx.exec(“The user name is Mary”);

结果:匹配成功,而且rs的值为{user}

例子2:

var regx=//d+(?!/.)/;
var rs=regx.exec(“54.235”);

结果:匹配成果,rs的值为{5},不匹配54是因为54后面跟着“.”号,当然235也匹配,但是由于exec方法的行为,235不会被返回

12>x|y:匹配x或y。注意如果x和y都匹配上了,那么只记住x。

例子:

var regx=/beijing|shanghai/;
var rs=regx.exec(“I love beijing and shanghai”);

结果:匹配成功,rs的值为{beijing},虽然shanghai也匹配,但不会被记住。

13>{n}:匹配前一个字符的n次出现。
n必须是一个非负数,当然如果是一个负数或小数也不会报语法错误。

例子:

var regx=/ab{2}c/;
var rs=regx.exec(“abbcd”);

结果:匹配成功,rs的值为:{abbc}。

14>{n,}:匹配前一个字符的至少n次出现。

例子:

var regx=/ab{2,}c/;
var rs=regx.exec(“abbcdabbbc”);

结果:匹配成功,rs的值为:{abbc}。注意为什么abbbc也符合条件为什么没有被记住,这与exec方法的行为有关,后面会统一讲解。

15>{n,m}:匹配前一个字符的至少n次最多m次的出现。
只要n与m为数字,而且m>=n就不会报语法错误。

例子:

var regx=/ab{2,5}c/;
var rs=regx.exec(“abbbcd”);

结果:匹配成功,rs的值为:{abbbc}。

例子2:

var regx=/ab{2,2}c/;
var rs=regx.exec(“abbcd”);

结果:匹配成功,rs的值为:{abbc}。

例子3:

var regx=/ab(2,5)/;
var rs=regx.exec(“abbbbbbbbbb”);

结果:匹配成功,rs的值为:{abbbbb},这说明,如果前一个字符出现多于m次,则只匹配m次。另外:
var regx=/ab(2,5)c/;
var rs=regx.exec(“abbbbbbbbbbc”);
结果:匹配失败,rs的值为:null,为什么匹配失败,因为b多于5个则b(2,5)会匹配前5个b,,而表达式/ab(2,5)c/中b后面是c,但字符串中5个b之后还是b所以会报错。

16>[xyz]:xyz表示一个字符串,该模式表示匹配[]中的一个字符,形式上[xyz]等同于[x-z]。

例子:

var regx=/a[bc]d/;
var rs=regx.exec(“abddgg”);

结果:匹配成功,rs的值为:{abd}

例子2:

var regx=/a[bc]d/;
var rs=regx.exec(“abcd”);

结果:匹配失败,rs的值为:null,之所以失败,是因为[bc]表示匹配b或c中的一个,但不会同时匹配。

17>[^xyz]:该模式表示匹配非[]中的一个字符,形式上[^xyz]等同于[^x-z]。

例子:

var regx=/a[^bc]d/;
var rs=regx.exec(“afddgg”);

结果:匹配成功,rs的值为:{afd}

例子2:

var regx=/a[^bc]d/;
var rs=regx.exec(“abd”);

结果:匹配失败,rs的值为:。

18>[/b]:匹配退格键。

19>/b:匹配一个词的边界符,例如空格和换行符等等,当然匹配换行符时,表达式应该附加参数m。

例子:

var regx=//bc./;
var rs=regx.exec(“Beijing is a beautiful city”);

结果:匹配成功,rs的值为:{ci},注意c前边的空格不会匹配到结果中,即{ ci}是不正确的。

20>/B:代表一个非单词边界。

例子:

var regx=//Bi./;
var rs=regx.exec(“Beijing is a beautiful city”);

结果:匹配成功,rs的值为:{ij},即匹配了Beijing中的ij。

21>/cX,匹配一个控制字符。例如, /cM 匹配一个 Control-M 或
回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一
个原义的 'c' 字符。(实际的例子还需补充)

21>/d:匹配一个数字字符,等同于[0-9]。

例子:

var regx=/user/d/;
var rs=regx.exec(“user1”);

结果:匹配成功,rs的值为:{user1}

22>/D:匹配一个非数字字符,等同于[^0-9]。
例子:

var regx=/user/D/;
var rs=regx.exec(“userA”);

结果:匹配成功,rs的值为:{userA}

23>/f:匹配一个换页符。

24>/n:匹配一个换行符。因为是换行符,所以在表达式中要加入m参数。
例子:

var regx=/a/nbc/m;
 var str=“a
 bc”;
var rs=regx.exec(str);

       结果:匹配成功,rs的值为:{ },如果表达式为/a/n/rbc/,则不会被匹配,因此在一般的编辑器中一个”Enter”键代表着“回车换行”,而非“换行回车”,至少在textarea域中是这样的。      
25>/r:匹配一个回车符

26>/s:匹配一个空格符,等同于[ /f/n/r/t/v/u00A0/u2028/u2029].

例子:

var regx=//si/;
var rs=regx.exec(“Beijing is a city”);

结果:匹配成功,rs的值为:{ i}

27>/S:匹配一个非空格符,等同于[ ^/f/n/r/t/v/u00A0/u2028/u2029].

例子:

var regx=//si/;
var rs=regx.exec(“Beijing is a city”);

结果:匹配成功,rs的值为:{ei}

28>/t:匹配一个tab

例子:

var regx=/a/tb/;
var rs=regx.exec(“a bc”);

结果:匹配成功,rs的值为: {a   bc}

29>/v:匹配一个竖向的tab

30>/w:匹配一个数字、_或字母表字符,即[A-Za-z0-9_ ]。

例子:

var regx=//w/;
var rs=regx.exec(“$25.23”);

结果:匹配成功,rs的值为:{2}

31>/W:匹配一个非数字、_或字母表字符,即[^A-Za-z0-9_ ]。

例子:

var regx=//w/;
var rs=regx.exec(“$25.23”);

结果:匹配成功,rs的值为:{$}

32>/n:注意不是/n,这里n是一个正整数,表示匹配第n个()中的字符。

例子:

var regx=/user([,-])group/1role/;
var rs=regx.exec(“user-group-role”);

结果:匹配成功,rs的值为:{user-group-role,-},同样对user,group,role的匹配也是成功的,但像user-group,role等就不对了。

33>/0:匹配一个NUL字符。

34>/xhh:匹配一个由两位16进制数字所表达的字符。

35>/uhhhh:匹配一个由四位16进制数字所表达的字符。

3,表达式操作

1)表达式操作,在这里是指和表达式相关的方法,我们将介绍六个方法。
2)表达式对象(RegExp)方法:

1>exec(str),返回str中与表达式相匹配的第一个字符串,而且以数组的形式表现,当然如果表达式中含有捕捉用的小括号,则返回的数组中也可能含有()中的匹配字符串,例如:

var regx=//d+/;
var rs=regx.exec(“3432ddf53”);

返回的rs值为:{3432}

var regx2=new RegExp(“ab(/d+)c”);
var rs2=regx2.exec(“ab234c44”);

返回的rs值为:{ab234c,234}
另外,如果有多个合适的匹配,则第一次执行exec返回一个第一个匹配,此时继续执行exec,则依次返回第二个第三个匹配。例如:

var regx=/user/d/g;
var rs=regx.exec(“ddduser1dsfuser2dd”);
var rs1=regx.exec(“ddduser1dsfuser2dd”);

则rs的值为{user1},rs的值为{rs2},当然注意regx中的g参数是必须的,否则无论exec执行多少次,都返回第一个匹配。后面还有相关内容涉及到对此想象的解释。

2>test(str),判断字符串str是否匹配表达式,返回一个布尔值。例如:

var regx=/user/d+/g;
var flag=regx.test(“user12dd”);

flag的值为true。

3)String对象方法

1>match(expr),返回与expr相匹配的一个字符串数组,如果没有加参数g,则返回第一个匹配,加入参数g则返回所有的匹配
例子:

var regx=/user/d/g;
var str=“user13userddduser345”;
var rs=str.match(regx);

rs的值为:{user1,user3}

2>search(expr),返回字符串中与expr相匹配的第一个匹配的index值。
例子:

var regx=/user/d/g;
var str=“user13userddduser345”;
var rs=str.search(regx);

rs的值为:0

3>replace(expr,str),将字符串中匹配expr的部分替换为str。另外在replace方法中,str中可以含有一种变量符号$,格式为$n,代表匹配中被记住的第n的匹配字符串(注意小括号可以记忆匹配)。
例子:

var regx=/user/d/g;
var str=“user13userddduser345”;
var rs=str.replace(regx,”00”);

rs的值为:003userddd0045
例子2:

var regx=/u(se)r/d/g;
var str=“user13userddduser345”;
var rs=str.replace(regx,”$1”);

rs的值为:se3userdddse45
对于replace(expr,str)方法还要特别注意一点,如果expr是一个表达式对象则会进行全局替换(此时表达式必须附加参数g,否则也只是替换第一个匹配),如果expr是一个字符串对象,则只会替换第一个匹配的部分,例如:

var regx=“user”
var str=“user13userddduser345”;
var rs=str.replace(regx,”00”);

rs的值为: 0013userddduser345

4>split(expr),将字符串以匹配expr的部分做分割,返回一个数组,而且表达式是否附加参数g都没有关系,结果是一样的。
例子:

var regx=/user/d/g;
var str=“user13userddduser345”;
var rs=str.split(regx);

rs的值为:{3userddd,45}

4,表达式相关属性

1)表达式相关属性,是指和表达式相关的属性,如下面的形式:

var regx=/myexpr/;
var rs=regx.exec(str);

其中,和表达式自身regx相关的属性有两个,和表达式匹配结果rs相关的属性有三个,下面将逐一介绍。
2)和表达式自身相关的两个属性:

1>lastIndex,返回开始下一个匹配的位置,注意必须是全局匹配(表达式中带有g参数)时,lastIndex才会有不断返回下一个匹配值,否则该值为总是返回第一个下一个匹配位置,例如:

var regx=/user/d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var lastIndex1=regx.lastIndex;
rs=regx.exec(“sdsfuser1dfsfuser2”);
var lastIndex2=regx.lastIndex;
rs=regx.exec(“sdsfuser1dfsfuser2”);
var lastIndex3=regx.lastIndex;

上面lastIndex1为9,第二个lastIndex2也为9,第三个也是9;如果regx=/user/d/g,则第一个为9,第二个为18,第三个为0。

2>source,返回表达式字符串自身。例如:

var regx=/user/d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var source=regx.source;

source的值为user/d
3)和匹配结果相关的三个属性:

1>index,返回当前匹配的位置。例如:

var regx=/user/d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var index1=rs.index;
rs=regx.exec(“sdsfuser1dfsfuser2”);
var index2=rs.index; 
rs=regx.exec(“sdsfuser1dfsfuser2”);
var index3=rs.index;

index1为4,index2为4,index3为4,如果表达式加入参数g,则index1为4,index2为13,index3会报错(index为空或不是对象)。

2>input,用于匹配的字符串。例如:

var regx=/user/d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var input=rs.input;

input的值为sdsfuser1dfsfuser2。

3>[0],返回匹配结果中的第一个匹配值,对于match而言可能返回一个多值的数字,则除了[0]外,还可以取[1]、[2]等等。例如:

var regx=/user/d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var value1=rs[0];
rs=regx.exec(“sdsfuser1dfsfuser2”);
var value2=rs[0];

value1的值为user1,value2的值为user2

5,实际应用

1)实际应用一
描述:有一表单,其中有一个“用户名”input域
要求:汉字,而且不能少于2个汉字,不能多于4个汉字。
实现:

<script>
function checkForm(obj){
   var username=obj.username.value;
   var regx=/^[/u4e00-/u9fa5]{2,4}$/g
   if(!regx.test(username)){
        alert(“Invalid username!”);
        return false; 
   }
   return true;
}
</script>
<form name=“myForm”onSubmit=“return checkForm(this)”>
  <input type=“text” name=“username”/>
  <input type=“submit” vlaue=“submit”/>
</form>

2)实际应用二

描述:给定一个含有html标记的字符串,要求将其中的html标记去掉。

实现:

<script>
function toPlainText(htmlStr){
   var regx=/<[^>]*>|<//[^>]*>/gm;
   var str=htmlStr.replace(regx,"");
   return str;
}
</script>
<form name=“myForm”>
  <textarea id=“htmlInput”></textarea>
  <input type=“button” value=“submit” onclick=“toPlainText(document.getElementById(‘htmlInput&#39;).value”/>
</form>

三,小结

1,Javascript正则表达式,我想在一般的程序员之中,使用者应该不是很多,因为我们处理的页面一般都不是很复杂,而复杂的逻辑一般我们都在后台处理完成了。但是目前趋势已经出现了扭转,富客户端已经被越来越多的人接受,而Javascript就是其中的关键技术,对于复杂的客户端逻辑而言,正则表达式的作用也是很关键的,同时它也是Javascript高手必须要掌握的重要技术之一。

2,为了能够便于大家对前面讲述的内容有一个更为综合和深刻的认识,我将前面的一些关键点和容易犯糊涂的地方再系统总结一下,这部分很关键!

总结1:附件参数g的用法

表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义。我们详细叙述:

1)对于表达式对象的exec方法,不加入g,则只返回第一个匹配,无论执行多少次均是如此,如果加入g,则第一次执行也返回第一个匹配,再执行返回第二个匹配,依次类推。例如

var regx=/user/d/;
var str=“user18dsdfuser2dsfsd”;
var rs=regx.exec(str);//此时rs的值为{user1}
var rs2=regx.exec(str);//此时rs的值依然为{user1}

如果regx=/user/d/g;则rs的值为{user1},rs2的值为{user2}

通过这个例子说明:对于exec方法,表达式加入了g,并不是说执行exec方法就可以返回所有的匹配,而是说加入了g之后,我可以通过某种方式得到所有的匹配,这里的“方式”对于exec而言,就是依次执行这个方法即可。

2)对于表达式对象的test方法,加入g于不加上g没有什么区别。

3)对于String对象的match方法,不加入g,也只是返回第一个匹配,一直执行match方法也总是返回第一个匹配,加入g,则一次返回所有的匹配(注意这与表达式对象的exec方法不同,对于exec而言,表达式即使加上了g,也不会一次返回所有的匹配)。例如:

var regx=/user/d/;
var str=“user1sdfsffuser2dfsdf”;
var rs=str.match(regx);//此时rs的值为{user1}
var rs2=str.match(regx);//此时rs的值依然为{user1}

如果regx=/user/d/g,则rs的值为{user1,user2},rs2的值也为{user1,user2}

4)对于String对象的replace方法,表达式不加入g,则只替换第一个匹配,如果加入g,则替换所有匹配。(开头的三道测试题能很好的说明这一点)

5)对于String对象的split方法,加上g与不加g是一样的,即:

var sep=/user/d/;
var array=“user1dfsfuser2dfsf”.split(sep);

则array的值为{dfsf, dfsf}

此时sep=/user/d/g,返回值是一样的。

6)对于String对象的search方法,加不加g也是一样的。

总结2:附加参数m的用法

附加参数m,表明可以进行多行匹配,但是这个只有当使用^和$模式时才会起作用,在其他的模式中,加不加入m都可以进行多行匹配(其实说多行的字符串也是一个普通字符串),我们举例说明这一点

1)使用^的例子

var regx=/^b./g;
var str=“bd76 dfsdf
     sdfsdfs dffs
     b76dsf sdfsdf”;
var rs=str.match(regx);

此时加入g和不加入g,都只返回第一个匹配{bd},如果regx=/^b./gm,则返回所有的匹配{bd,b7},注意如果regx=/^b./m,则也只返回第一个匹配。所以,加入m表明可以进行多行匹配,加入g表明可以进行全局匹配,综合到一起就是可以进行多行全局匹配

2)使用其他模式的例子,例如

var regx=/user/d/;
var str=“sdfsfsdfsdf
     sdfsuser3 dffs
     b76dsf user6”;
var rs=str.match(regx);

此时不加参数g,则返回{user3},加入参数g返回{user3,user6},加不加入m对此没有影响。

3)因此对于m我们要清楚它的使用,记住它只对^和$模式起作用,在这两种模式中,m的作用为:如果不加入m,则只能在第一行进行匹配,如果加入m则可以在所有的行进行匹配。我们再看一个^的例子

var regx=/^b./;
var str=“ret76 dfsdf
     bjfsdfs dffs
     b76dsf sdfsdf”;
var rs=str.match(regx);

此时rs的值为null,如果加入g,rs的值仍然为null,如果加入m,则rs的值为{bj}(也就是说,在第一行没有找到匹配,因为有参数m,所以可以继续去下面的行去找是否有匹配),如果m和g都加上,则返回{bj,b7}(只加m不加g说明,可以去多行进行匹配,但是找到一个匹配后就返回,加入g表明将多行中所有的匹配返回,当然对于match方法是如此,对于exec呢,则需要执行多次才能依次返回)

总结3:

在HTML的textarea输入域中,按一个Enter键,对应的控制字符为“/r/n”,即“回车换行”,而不是“/n/r”,即“换行回车”,我们看一个前面我们举过的例子:

var regx=/a/r/nbc/;
var str=“a
     bc”;
var rs=regx.exec(str);

结果:匹配成功,rs的值为:{  },如果表达式为/a/n/rbc/,则不会被匹配,因此在一般的编辑器中一个”Enter”键代表着“回车换行”,而非“换行回车”,至少在textarea域中是这样的。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于js鼠标按键事件和键盘按键事件的使用方法

基于Vue-cli搭建的项目如何和后台交互的介绍

Das obige ist der detaillierte Inhalt vonInformationen zur Verwendung von RegExp-Objekten und Klammern in regulären JS-Ausdrücken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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