Heim > Artikel > Web-Frontend > Grundlegende Einführung in reguläre Ausdrücke und Lernbeispiele
Ich stoße oft auf Situationen, in denen ich reguläre Ausdrücke verwenden muss, und ich suche, kopiere und füge sie immer ein. Mit der Zeit wusste ich ein wenig über reguläre Ausdrücke, aber jetzt habe ich Schwierigkeiten, einen komplexen Ausdruck überhaupt zu lesen. . Deshalb habe ich beschlossen, reguläre Ausdrücke gut zu lernen. Hier werde ich mit den Grundlagen beginnen, mehrere gängige Ausdrücke aufzeichnen, die Fähigkeit zum Lesen regulärer Ausdrücke üben und das Regexp-Objekt in JavaScript kurz vorstellen.
Regulärer Ausdruck: Es handelt sich um ein Textmuster, das aus allgemeinen Zeichen und Sonderzeichen besteht Zeichenfolgenvergleichsregel, mit der überprüft werden kann, ob eine Zeichenfolge eine bestimmte Teilzeichenfolge enthält, eine bestimmte Zeichenfolge ersetzt oder eine bestimmte Teilzeichenfolge aus einer Zeichenfolge extrahiert werden kann. Reguläre Ausdrücke erstellen Genau wie mathematische Ausdrücke können Sie kleine Ausdrücke kombinieren, um größere Ausdrücke zu erstellen.
Normale Zeichen : Zu den normalen Zeichen zählen alle druckbaren und nicht druckbaren Zeichen, die nicht explizit als Metazeichen gekennzeichnet sind. Dazu gehören alle Groß- und Kleinbuchstaben, alle Zahlen, alle Satzzeichen und einige andere .Symbol.
非打印字符 | 说明 |
cx | 匹配由x指明的控制字符。例如 cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
f | 匹配一个换页符。等价于 x0c 和 cL。 |
n | 匹配一个换行符。等价于 x0a 和 cJ。 |
r | 匹配一个回车符。等价于 x0d 和 cM。 |
s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。 |
S | 匹配任何非空白字符。等价于 [^ fnrtv] |
t | 匹配一个制表符。等价于 x09 和 cI |
v | 匹配一个垂直制表符。等价于 x0b 和 cK |
特殊字符 | 描述 |
$ | 匹配输入字符串的结尾位置。 |
() | 标记一个子表达式的开始和结束。 |
* | 匹配前面子表达式零次或多次。 |
+ | 匹配前面的子表达式一次或多次。 |
. | 匹配除换行符n之外的任何单字符。 |
[ | 标记一个中括号表达式的开始。 |
? | 匹配前面的子表达式一次或零次或指明一个非贪婪限定符。 |
将下一个字符标记为特殊字符、或元义字符、或向后引用、或八进制转义符。 | |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。 |
{ | 标记限定符表达式的开始。 |
| | 指明两项之间的一个选择。 |
Qualifizierer: Der Qualifizierer wird verwendet, um anzugeben, wie oft eine bestimmte Komponente des regulären Ausdrucks vorkommen muss, um die variable Anzahl von Übereinstimmungen zu erfüllen, hauptsächlich einschließlich {0 oder 1}, {1 oder n} , {0 oder 1}, {n}, {größer als oder gleich n}, {größer als oder gleich n, kleiner als oder gleich m} sechs Typen. Die entsprechenden Ausdrücke sind *, +,? ,{n},{n,},{n,m}.
限定符 | 描述 |
* | 匹配前面的子表达式零次或多次。 |
+ | 匹配前面的表达式一次或多次。 |
? | 匹配前面的子表达式零次或一次。 |
{n} | n是一个非负整数,匹配确定的n次。 |
{n,} | n是一个非负整数,至少匹配n次。 |
{n,m} | m,n是非负整数,n<=m,最少匹配n次,最多匹配m次。注意在“,”和两个数之间不能有空格。 |
Locator : Mit dem Locator können wir den regulären Ausdruck am Anfang oder Ende der Zeile fixieren. Sie können auch spezielle Ausdrücke erstellen, zum Beispiel: reguläre Ausdrücke, die innerhalb eines Wortes oder am Anfang eines Wortes oder am Ende eines oder mehrerer Male vorkommen. Locators werden zur Beschreibung von Zeichenfolgen- oder Wortgrenzen verwendet.
字符 | 描述 |
^ | 匹配输入字符串的开始位置。如果设置RegExp为Multiline属性,还可以与n和r之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置RegExp为Multiline属性,还可以与n和r之后的位置匹配。 |
b | 匹配一个字边界,即字与空格间的位置。 |
B | 非字边界匹配。 |
Hinweis: Sie können keine Qualifizierer mit Ankerpunkten verwenden, da es nicht mehr als eine Position vor oder nach einer Zeilenumbruch- oder Wortgrenze geben kann, sind „Ausdrücke wie ^*“ nicht zulässig.
Um Text am Anfang einer Textzeile abzugleichen, sollte ^ am Anfang des regulären Ausdrucks platziert werden; um Text am Ende einer Textzeile abzugleichen, verwenden Sie $ am Ende des regulären Ausdrucks Ausdruck. Verwechseln Sie diese Verwendung von ^ oder $ nicht mit der Verwendung von Ausdrücken in Klammern.
zB:
/^Kapitel [1-9][0-9]{0,1}/passende Kapiteltitel sind zwei Die Anzahl der Ziffern des Titels, der mit Chapter
/^Chapter [1-9][0-9]{0,1}$/ beginnt, entspricht sowohl dem Anfang als auch dem Ende des Kapiteltitels, das heißt, diese Zeile hat nur den Kapiteltitel
/bCha/ entspricht Wortgrenzen, also Grenzen, die mit Cha <🎜 beginnen >
/ terb/Wörter, die auf ter enden.
/Bapt/, stimmt mit Nicht-Wortgrenzen überein, wie z. B. „apt“ in Kapitelübereinstimmungen, aber „aptitude“ stimmt nicht mit
überein Auswählen: Schließen Sie alle Elemente in Klammern ein und trennen Sie angrenzende Auswahlen mit |. Aber ein Nebeneffekt der Verwendung von Klammern ist, dass die relevanten Übereinstimmungen zwischengespeichert werden und zu diesem Zeitpunkt verfügbar sind? : Setzen Sie als erste Option, um diesen Nebeneffekt zu beseitigen;
Nicht erfassendes Element:
Rückverweis: (Unerklärlicherweise dachte ich an Rekursion in der C-Sprache...) Ich denke, für Laien ausgedrückt bezieht sich ein Rückverweis auf ein Muster, das zwischengespeichert wurde, was im Folgenden der Durchgang n ist Artikel, um auf den Puffer zuzugreifen. Das Hinzufügen von Klammern um ein reguläres Ausdrucksmuster oder einen Teil eines Musters führt dazu, dass die zugehörigen Übereinstimmungen in einem temporären Puffer (ähnlich einer Teilzeichenfolge) gespeichert werden. Denken Sie daran, was ich am Anfang gesagt habe: Reguläre Ausdrücke sind wie mathematische Ausdrücke und bestehen aus kleinen einfachen Ausdrücken .Ausdrücke werden zu großen komplexen Ausdrücken kombiniert, diese temporären Puffer können als Übereinstimmungsergebnisse dieser kleinen Ausdrücke verstanden werden, und jede erfasste Unterübereinstimmung wird in der Reihenfolge von links nach rechts im Ausdruck gespeichert. Die Puffernummern beginnen bei 1 und können bis zu 99 erfasste Unterausdrücke speichern. Auf jeden Puffer kann mit n zugegriffen werden, wobei n eine ein- oder zweistellige Dezimalzahl ist, die einen bestimmten Puffer identifiziert. Können nicht erfassende Metazeichen verwendet werden? :,? =,? ! um die Erfassung zu überschreiben und das Caching verwandter Übereinstimmungen zu ignorieren.
Eine der einfachsten und nützlichsten Anwendungen von Rückverweisen ist die Möglichkeit, Übereinstimmungen zweier identischer benachbarter Wörter im Text zu finden:
Beispiel 1: Identische Wörter extrahieren.
var str=Steigen dadurch die Benzinkosten?
var patt1= /b([a-z]+) 1b/;
document.write(str.match(patt1));
eg2: Teilen Sie die URL davon auf Beispiel Es scheint, dass der Rückverweis tatsächlich die Unterelemente im großen Ausdruck zitiert oder extrahiert und ich finde, dass dieser Rückverweis etwas unklar ist. (Fügen Sie es vorerst hier ein, notieren Sie es und ändern Sie es später);
var patt1 = /(w+) ://([^/:]+)(:d*) ?([^# ]*)/; arr = str .match(patt1); 1./Kapitel [1-9][0-9]/ Dieser Ausdruck entspricht Kapitel + einer beliebigen Ganzzahl, z. B. 1, 19, 109, 10099. . . . Zuerst wird das vorherige Kapitel festgelegt, [1-9] wird ebenfalls festgelegt und dann wird [0-9] durch das Qualifikationsmerkmal * qualifiziert, was bedeutet, dass es null oder mehrmals vorkommen kann. Daher kann es leer, ein Bit oder mehrere Bits sein. 2./[a-zA-z]+://[^s]*/ Match-URL 3./d{3}-d{ 8}|d{4}-{7,8}/ Inländische Telefonnummer abgleichen 4.[1-9][0-9]{4,} Übereinstimmung mit der Tencent QQ-Nummer 5.[1-9]d{5}(?!d) Übereinstimmung mit der inländischen Postleitzahl 6.^(d{ 6})(d{4})(d{2})(d{2})(d{3})([0-9]|X)$ entspricht der 18-stelligen ID-Nummer 7.^[1-9]d*$ entspricht positiven ganzen Zahlen. 8.^-[1-9]d* entspricht Negative Ganzzahl 9.^-?[1-9]d*$ entspricht der Ganzzahl 10.^[1-9]d*.d*|0 .d*[1-9]d*$ entspricht einer positiven Gleitkommazahl 11.^-[1-9]d*.d*|-0.d*[1 - 9]d*$ Übereinstimmung mit einer negativen Gleitkommazahl 1.Erstellen Sie ein reguläres Ausdrucksobjekt: new RegExp(pattern, attributes); Der 2.Attribute des RegExP-Objekts: global: Ob das RegExp-Objekt das Flag m hat z. B.: if( ignoreCase: Ob das RegExp-Objekt das Flag m hat; laseIndex: eine Ganzzahl, die die Zeichenposition markiert, an der die nächste Übereinstimmung beginnt; RegExp-Objekt hat das Flag m; Quelle: der Originaltext des regulären Ausdrucks. 3. : : Kompilieren Sie den regulären Ausdruck. compile() hat zwei Verwendungszwecke: Die erste besteht darin, reguläre Ausdrücke während der Skriptausführung zu kompilieren. Der zweite besteht darin, den regulären Ausdruck zu ändern und neu zu kompilieren. z. B.: RegExpObject.compile(regexp,modifier); Der erste Parameter ist der reguläre Ausdruck und der zweite Parameter gibt den Übereinstimmungstyp an ; exec:检索字符串中指定的值,返回找到的值并确定其位置。 eg:RegExpObject.exec(string);//返回一个结果,用于存放匹配的数组,如果未找到匹配,则为null。 exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。 如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。 但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。 重要事项:如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。 提示:请注意,无论 RegExpObject 是否是全局模式,exec() 都会把完整的细节添加到它返回的数组中。这就是 exec() 与 String.match() 的不同之处,后者在全局模式下返回的信息要少得多。因此我们可以这么说,在循环中反复地调用 exec() 方法是唯一一种获得全局模式的完整模式匹配信息的方法。 Das obige ist der detaillierte Inhalt vonGrundlegende Einführung in reguläre Ausdrücke und Lernbeispiele. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!2. Üben Sie das Lesen regulärer Ausdrücke.
Drei, das RegExp-Objekt von JavaScript
pattern-Parameter bezieht sich auf den regulären Ausdruck, der eine Zeichenfolge ist, und attributes ist ein optionaler Parameter, einschließlich g, Ich bin. Beziehen Sie sich jeweils auf globales Matching, case-sensitive und mehrzeiliges Matching. patt1.global
)
{
Alert("Globale Eigenschaft ist festgelegt");
}; 说明:
提示和注释
var str = "正则表达式的exec方法测试";
var patt = new RegExp("exec","g");var result;while ((result = patt.exec(str)) != null) {
document.write('result:'+result);
document.write("<br />");
document.write('patt.lastIndex:'+patt.lastIndex);
}<p><strong>test</strong>:检索字符串中指定的值,返回true或false。</p>
<p>eg:var result = patt1.test(str);</p>
<p>4.<strong>支持正则表达式的string对象的方法</strong>:</p>
<p><strong>search</strong>:检索与正则表达式相匹配的值。</p>
<p>stringObj.search(regexp);//参数可以是子串,也可以是regexp对象。</p>
<p>注意:search()方法不执行全局匹配,它将忽略标志g,它同时忽略regexp的lastIndex属性,并且总是从字符串开始进行检索,所以他的返回值始终是sgringObj的第一个匹配的位置。如果要忽略大小写应追加i标记。</p>
<p>document.write(str.search(/abc/i);</p>
<p><strong>match</strong>:找到一个或多个正则表达式的匹配。</p>
<p>stringObj.match(searchValue);//参数为要检索的字符串值</p>
<p>stringObj.match(regexp);//要匹配的模式的regexp对象。</p>
<p>返回存放匹配结果的数组。该数组的内容依赖于regexp是否具有全局属性g;</p>
<h3>说明</h3>
<p>match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。</p>
<p>如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。</p>
<p>如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。</p>
<p class="important">注意:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果您需要这些全局检索的信息,可以使用 RegExp.exec()。</p>
<p class="important">eg:document.write(<code>str.match(/\d+/g)</code>);</p>
<p><strong>replace</strong>:替换与正则表达式匹配的子串。</p>
<p>stringObect.replace(regexp/substr,replacement);</p>
<p>regexp/substr:必须,正则表达式或者自字符串。</p>
<p>replacement):一个字符串值,规定了替换文本或生成替换文本的函数。</p>
<p>返回一个新的字符串,使用replacement替换第一次匹配或者所有匹配之后得到的。注意:指定g全局变量则替换所有的匹配,否则只替换第一次匹配到的字符串。</p>
<p><strong>split</strong>:把字符串分割为字符串数组。</p>
<p>stringObect.split(separator,howmany);</p>
<p>separator:必须,字符串或正则表达式,从该参数指定的地方分割字符串;</p>
<p>howmany:可选,指定返回数组的最大长度,若设置了该参数,返回的子串不会多余这个参数指定的数组,如果没有设置该参数,整个字符串都会被分割。</p>
<p>返回一个字符串数组,不包括separator本身。</p>
<p> </p>
<pre class="brush:php;toolbar:false"><br><br>
In Verbindung stehende Artikel
Mehr sehen