Heim  >  Artikel  >  Web-Frontend  >  Die Verwendung und grundlegende Syntax regulärer JS-Ausdrücke

Die Verwendung und grundlegende Syntax regulärer JS-Ausdrücke

php中世界最好的语言
php中世界最好的语言Original
2018-03-29 11:19:071204Durchsuche

Dieses Mal werde ich Ihnen die Verwendung und die grundlegende Syntax von JS-Regex vorstellen. Was sind die Vorsichtsmaßnahmen bei der Verwendung von JS-Regex?

Die vorherigen Wörter

 Reguläre Ausdrücke mögen für die Menschen eine Ansammlung unverständlicher Zeichen sein, aber es sind diese Symbole, die effiziente Operationen an Strings ermöglichen. Wie so oft ist das Problem selbst nicht kompliziert, aber das Fehlen regulärer Ausdrücke wird zu einem großen Problem. Reguläre Ausdrücke in JavaScript sind sehr wichtige Kenntnisse. In diesem Artikel wird die grundlegende Syntax regulärer Ausdrücke vorgestellt.

Definition

Regulärer Ausdruck ist eine grammatikalische Spezifikation einer einfachen Sprache. Es ist ein leistungsstarkes, praktisches und effizientes Textverarbeitungstool. Es wird in einigen Methoden zum Implementieren von Such-, Ersetzungs- und Extraktionsoperationen für Informationen in Zeichenfolgen verwendet.

JavaScript Der reguläre Ausdruck in wird durch RegExp-Objekt dargestellt. Es gibt zwei Schreibmethoden: eine ist wörtliches Schreiben; die andere ist KonstruktorSchreiben

regulärer Ausdruck. Dies ist besonders nützlich für die Verarbeitung von Zeichenfolgen. Es gibt viele Stellen, an denen reguläre Ausdrücke in JavaScript verwendet werden können. Dieser Artikel fasst die Grundkenntnisse über reguläre Ausdrücke und die Verwendung regulärer Ausdrücke in JavaScript zusammen.

Der erste Teil listet kurz die Verwendungsszenarien regulärer Ausdrücke in JavaScript auf. Der zweite Teil führt detailliert in die Grundkenntnisse regulärer Ausdrücke ein und schreibt einige Beispiele zum leichteren Verständnis.

Der Inhalt dieses Artikels ist meine eigene Zusammenfassung, nachdem ich die Schreibmethode für reguläre Ausdrücke und das Kapitel über js-reguläre Ausdrücke im Rhino-Buch gelesen habe. Daher kann der Inhalt Auslassungen und Ungenauigkeiten aufweisen. Sollten Experten vorbeikommen und Fehler im Artikel finden, korrigieren Sie diese bitte!

Die Verwendung regulärer Ausdrücke in Javascript

Ein regulärer Ausdruck kann als charakteristische Beschreibung eines Zeichenfragments und seiner Funktion betrachtet werden besteht darin, aus einer Reihe von Zeichenfolgen Teilzeichenfolgen zu finden, die die Bedingungen erfüllen. Wenn ich beispielsweise in JavaScript einen regulären Ausdruck definiere:

var reg=/hello/  或者 var reg=new RegExp("hello")

, dann kann dieser reguläre Ausdruck verwendet werden, um das Wort Hallo aus einer Reihe von Zeichenfolgen zu finden. Das Ergebnis der Aktion „Suchen“ kann darin bestehen, die Position des ersten Hallos zu finden, „Hallo“ durch eine andere Zeichenfolge zu ersetzen, alle Hallos zu finden usw. Nachfolgend finden Sie eine Liste von Funktionen, die reguläre Ausdrücke in JavaScript verwenden können. Im zweiten Teil wird eine kurze Einführung in die Funktionen dieser Funktionen gegeben.

String.prototype.search-Methode

wird verwendet, um den Index des ersten Vorkommens eines Teilstrings im Originalstring zu finden. Wenn nicht, wird -1 zurückgegeben 🎜>

"abchello".search(/hello/); // 3

String.prototype.replace-Methode

wird verwendet, um Teilzeichenfolgen in einem String zu ersetzen

"abchello".replace(/hello/,"hi");  // "abchi"

String.prototype. Die Split-Methode

wird zum Teilen der Zeichenfolge verwendet.

"abchelloasdasdhelloasd".split(/hello/); //["abc", "asdasd", "asd"]

Die String.prototype.match-Methode

wird zum Erfassen von Unterzeichen verwendet den String String in ein Array. Standardmäßig wird nur ein Ergebnis im Array erfasst. Wenn der reguläre Ausdruck das Attribut „globale Erfassung“ hat (fügen Sie beim Definieren des regulären Ausdrucks den Parameter g hinzu), werden alle Ergebnisse im Array erfasst

"abchelloasdasdhelloasd".match(/hello/); //["hello"]
"abchelloasdasdhelloasd".match(/hello/g); //["hello","hello"]
Die Match-Methode verhält sich unterschiedlich, unabhängig davon, ob der als Match-Parameter verwendete reguläre Ausdruck über globale Attribute verfügt, die später in der Gruppierung regulärer Ausdrücke erläutert werden.

RegExp.prototype.test-Methode

wird verwendet, um zu testen, ob die Zeichenfolge Teilzeichenfolgen enthält

/hello/.test("abchello"); // true

RegExp.prototype Die . Die Exec-Methode

ähnelt der Match-Methode einer Zeichenfolge. Diese Methode erfasst auch Zeichenfolgen, die die Bedingungen aus der Zeichenfolge erfüllen, es gibt jedoch zwei Unterschiede.

1. Die exec-Methode kann jeweils nur einen Teilstring in einem Array erfassen, unabhängig davon, ob der reguläre Ausdruck globale Attribute hat

var reg=/hello/g;
reg.exec("abchelloasdasdhelloasd");  // ["hello"]
2 🎜 >(Das heißt, das RegExp-Objekt in JavaScript) verfügt über ein lastIndex-Attribut, das verwendet wird, um anzugeben, wo beim nächsten Mal mit der Erfassung begonnen werden soll. Nach jeder Ausführung der exec-Methode wird lastIndex zurückgeschoben, bis kein passendes Zeichen gefunden wird und null ist wird zurückgegeben. Starten Sie dann die Aufnahme erneut von vorne. Diese Eigenschaft kann zum Durchlaufen von Teilzeichenfolgen in einer erfassten Zeichenfolge verwendet werden.

var reg=/hello/g;
reg.lastIndex; //0
reg.exec("abchelloasdasdhelloasd"); // ["hello"]
reg.lastIndex; //8
reg.exec("abchelloasdasdhelloasd"); // ["hello"]
reg.lastIndex; //19
reg.exec("abchelloasdasdhelloasd"); // null
reg.lastIndex; //0

正则表达式基础

元字符

 上面第一节以/hello/为例,但是实际应用中可能会遇到这样的需求: 匹配一串不确定的数字、匹配开始的位置、匹配结束的位置、匹配空白符。此时就可以用到元字符。

元字符:

//匹配数字: \d
"ad3ad2ad".match(/\d/g); // ["3", "2"]
//匹配除换行符以外的任意字符: .
"a\nb\rc".match(/./g); // ["a", "b", "c"]
//匹配字母或数字或下划线 : \w
"a5_ 汉字@!-=".match(/\w/g); // ["a", "5", "_"]
//匹配空白符:\s
"\n \r".match(/\s/g); //[" ", " ", ""] 第一个结果是\n,最后一个结果是\r
//匹配【单词开始或结束】的位置 : \b
"how are you".match(/\b\w/g); //["h", "a", "y"] 
// 匹配【字符串开始和结束】的位置: 开始 ^ 结束 $
"how are you".match(/^\w/g); // ["h"]

反义元字符,写法就是把上面的小写字母变成大写的,比如 , 匹配所有不是数字的字符: \D

另外还有一些用来表示重复的元字符,会在下面的内容中介绍。

字符范围

在 [] 中使用符号 -  ,可以用来表示字符范围。如:

// 匹配字母 a-z 之间所有字母
/[a-z]/
// 匹配Unicode中 数字 0 到 字母 z 之间的所有字符
/[0-z]/ 
// unicode编码查询地址:
//https://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF
//根据上面的内容,我们可以找出汉字的Unicode编码范围是 \u4E00 到 \u9FA5,所以我们可以写一个正则表达式来判断一个字符串中是否有汉字
/[\u4E00-\u9FA5]/.test("测试"); // true

重复 & 贪婪与懒惰

首先来讲重复,当我们希望匹配一些重复的字符时,就需要用到一些和重复相关的正则表达式,写法如下

//重复n次 {n}
"test12".match(/test\d{3}/); // null
"test123".match(/test\d{3}/); // ["test123"]
//重复n次或更多次 {n,}
"test123".match(/test\d{3,}/); // ["test123"]
//重复n到m次
"test12".match(/test\d{3,5}/); // null
"test12345".match(/test\d{3,5}/); // ["test12345"]
"test12345678".match(/test\d{3,5}/); // ["test12345"]
// 匹配字符test后边跟着数字,数字重复0次或多次
"test".match(/test\d*/); // ["test"]
"test123".match(/test\d*/); // ["test123"]
//重复一次或多次
"test".match(/test\d+/) ; // null
"test1".match(/test\d*/); //["test1"]
//重复一次或0次
"test".match(/test\d?/) ; // null
"test1".match(/test\d?/); //["test1"]

从上面的结果可以看到,字符test后边跟着的数字可以重复0次或多次时,正则表达式捕获的子字符串会返回尽量多的数字,比如/test\d*/匹配 test123 ,返回的是test123,而不是test或者test12。

正则表达式捕获字符串时,在满足条件的情况下捕获尽可能多的字符串,这就是所谓的“贪婪模式”。

对应的”懒惰模式“,就是在满足条件的情况下捕获尽可能少的字符串,使用懒惰模式的方法,就是在字符重复标识后面加上一个 "?",写法如下

// 数字重复3~5次,满足条件的情况下返回尽可能少的数字
"test12345".match(/test\d{3,5}?/); //["test123"]
// 数字重复1次或更多,满足条件的情况下只返回一个数字
"test12345".match(/test\d+?/); // ["test1"]

字符转义

在正则表达式中元字符是有特殊的含义的,当我们要匹配元字符本身时,就需要用到字符转义,比如:

/\./.test("."); // true

分组 & 分支条件

正则表达式可以用 " ()  " 来进行分组,具有分组的正则表达式除了正则表达式整体会匹配子字符串外,分组中的正则表达式片段也会匹配字符串。

分组按照嵌套关系和前后关系,每个分组会分配得到一个数字组号,在一些场景中可以用组号来使用分组。

在 replace、match、exec函数中,分组都能体现不同的功能。

replace函数中,第二个参数里边可以用 $+数字组号来指代第几个分组的内容,如:

" the best language in the world is java ".replace(/(java)/,"$1script"); // " the best language in the world is javascript "
"/static/app1/js/index.js".replace(/(\/\w+)\.js/,"$1-v0.0.1.js"); //"/static/app1/js/index-v0.0.1.js"    (\/\w+)分组匹配的就是 /index ,

在第二个参数中为其添加上版本号

match函数中,当正则表达式有全局属性时,会捕获所有满足正则表达式的子字符串

"abchellodefhellog".match(/h(ell)o/g); //["hello", "hello"]

但是当正则表达式没有全局属性,且正则表达式中有分组的时候,match函数只会返回整个正则表达式匹配的第一个结果,同时会将分组匹配到的字符串也放入结果数组中:

"abchellodefhellog".match(/h(ell)o/); //["hello", "ell"]
// 我们可以用match函数来分解url,获取协议、host、path、查询字符串等信息
"http://www.baidu.com/test?t=5".match(/^((\w+):\/\/([\w\.]+))\/([^?]+)\?(\S+)$/);
// ["http://www.baidu.com/test?t=5", "http://www.baidu.com", "http", "www.baidu.com", "test", "t=5"]

exec函数在正则表达式中有分组的情况下,表现和match函数很像,只是无论正则表达式是否有全局属性,exec函数都只返回一个结果,并捕获分组的结果

/h(ell)o/g.exec("abchellodefhellog"); //["hello", "ell"]

当正则表达式需要匹配几种类型的结果时,可以用到分支条件,例如

"asdasd hi asdad hello asdasd".replace(/hi|hello/,"nihao"); //"asdasd nihao asdad hello asdasd"
"asdasd hi asdad hello asdasd".split(/hi|hello/); //["asdasd ", " asdad ", " asdasd"]

 注意,分支条件影响它两边的所有内容, 比如 hi|hello  匹配的是hi或者hello,而不是 hiello 或者 hhello

分组中的分支条件不会影响分组外的内容

"abc acd bbc bcd ".match(/(a|b)bc/g); //["abc", "bbc"]

后向引用

正则表达式的分组可以在其后边的语句中通过  \+数字组号来引用

比如

// 匹配重复的单词
/(\b[a-zA-Z]+\b)\s+\1/.exec(" asd sf hello hello asd"); //["hello hello", "hello"]

断言

 (?:exp) , 用此方式定义的分组,正则表达式会匹配分组中的内容,但是不再给此分组分配组号,此分组在replace、match等函数中的作用也会消失,效果如下:

/(hello)\sworld/.exec("asdadasd hello world asdasd") // ["hello world", "hello"],正常捕获结果字符串和分组字符串
/(?:hello)\sworld/.exec("asdadasd hello world asdasd") // ["hello world"]
"/static/app1/js/index.js".replace(/(\/\w+)\.js/,"$1-v0.0.1.js"); //"/static/app1/js/index-v0.0.1.js"
"/static/app1/js/index.js".replace(/(?:\/\w+)\.js/,"$1-v0.0.1.js"); //"/static/app1/js$1-v0.0.1.js"

(?=exp) 这个分组用在正则表达式的后面,用来捕获exp前面的字符,分组中的内容不会被捕获,也不分配组号

/hello\s(?=world)/.exec("asdadasd hello world asdasd") // ["hello "]

(?!exp)  和前面的断言相反,用在正则表达式的后面,捕获后面不是exp的字符,同样不捕获分组的内容,也不分配组号

/hello\s(?!world)/.exec("asdadasd hello world asdasd") //null

处理选项

javascript中正则表达式支持的正则表达式有三个,g、i、m,分别代表全局匹配、忽略大小写、多行模式。三种属性可以自由组合共存。

// 全局匹配 g 
"abchelloasdasdhelloasd".match(/hello/); //["hello"]
"abchelloasdasdhelloasd".match(/hello/g); //["hello","hello"]
//忽略大小写 i
"abchelloasdasdHelloasd".match(/hello/g); //["hello"]
"abchelloasdasdHelloasd".match(/hello/gi); //["hello","Hello"]

在默认的模式下,元字符 ^ 和 $ 分别匹配字符串的开头和结尾处,模式 m 改变了这俩元字符的定义,让他们匹配一行的开头和结尾

"aadasd\nbasdc".match(/^[a-z]+$/g); //null 字符串^和$之间有换行符,匹配不上 [a-z]+ ,故返回null
"aadasd\nbasdc".match(/^[a-z]+$/gm); // ["aadasd", "basdc"] ,改变^$的含义,让其匹配一行的开头和末尾,可以得到两行的结果

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

lastIndex与正则表达式的关系

正则表达式的\D元字符(等价于"[^0-9]")使用详解

Das obige ist der detaillierte Inhalt vonDie Verwendung und grundlegende Syntax regulärer JS-Ausdrücke. 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