正则表达式是由元字符和普通字符组成。所谓元字符就是类似于“*”、“?”之类的有意义的字符,所谓的普通字符就是字符串中常用的字符。将普通字符和元字符放在一对斜杠(/)中,就可以组成一个正则表达式。
1、匹配字符
最简单的正则表达式就是字符本身的匹配,这种匹配方法相当于精确查找。
比如:/abc/ ,可以匹配到字符串“abc”(注意是匹配到字符串“abc”,不是单个字符“a”或“b”或“c”);
正则表达式中有很多字符有特殊意义,要匹配单个的字符(比如“?”),需要在转义字符前加上反斜杠“\”,
正则表达式中有很多转义字符:“\!”,“\$”,“\^”,“\*”,“\+”,“\=”,“\|”,“\.”,“\?”,“\\”,“\/”,“\(”,“\)”,“\[”,“\]”,“\{”,“\}”,“\o”,“\t”,“\n”,“\v”,“\f”,“\r”,“\xnn”,“\uxxxx”,“\cX”。
2、字符类
字符类在正则表达式中可以代表一系列字符,而不是只能代表一个字符或一个子字符串,字符串类是以中括号作为分界符的。
比如:/[ABC]/ ,可以匹配到“A”或“B”或“C”单个字符;假如要匹配的字符串为“JAVASCRIPT”,只会匹配到第一个“A”(因为除非使用全局模式标志,在完成第一次匹配后不会再进行后面的匹配了);
使用字符类还可以制定一系列字符:/[A-Z]/ //可以匹配到字母A到Z,/[a-z]/ //可以匹配到字母a到z,/[A-Za-z]/ //可以匹配到字母A到Z和字母a到z,/[0-9]/ //可以匹配到数字0到9,/[A-Za-z0-9]/ //可以匹配到字母A到Z、字母a到z、数字0到0,/[A-D159]/ //可以匹配到字母A到D和数字1、5、9;
除了要将匹配的字符放在[]中外,字符类还定义了一些特殊的字符,可以更加灵活地匹配到字符串;比如:字符类“XYZ”:字符集,可以匹配到中括号中的字符;字符类“^”:非字符集,可以匹配到非中括号中的任何字符;字符类“.”:匹配除了答行符和其他Unicode行符之外的所有字符;字符类“\w”:匹配任何ASCII单字字符,相当于[a-zA-Z0-9];字符类“\W”:匹配到所有ASCII单字字符之外的字符,相当于[^a-zA-Z0-9];字符类“\s”:匹配任何Unicode空白符,相当于[\f\n\r\t\v\u00A0\u2028\u2029];字符类“\S”:匹配任何Unicode空白符之外的字符相当于[^\f\n\r\t\v\u00A0\u2028\u2029];字符类“\d”:匹配任何数字,相当于[0-9];字符类“\D”:匹配任何数字之外的字符,相当于[^0-9]。
3、界定符
假设有一个字符串内容为“BaaaaaBaaaaaB”,要求匹配到第一个“B”和最后一个“B”,则可以使用界定符;
界定符“^”可以匹配到一行字符的开头,“/^B/”可以匹配到第一个“B”;界定符“$”可以匹配到一行字符的结尾,“/B$/”可以匹配到最后一个“B”;
更多界定符:界定符“^”:匹配行首,多用于多行文本搜索;界定符“$”:匹配行尾,多用于多行文本搜索;界定符“\b”:匹配单词的边界,多用于英文文本;界定符“\B”:与\b相反,匹配到一个非单词的边界。
4、选择符
假设要在一个字符串中查找子字符串A和子字符串B,在正则表达式中用一个选择符“|”,使用这个选择符可以匹配多个子字符串;例如字符串1“AAAaaaaaaaBBB”、字符串2“AAAaaaaaaa”、字符串3“BBBaaaaaaa”,使用/AAA|BBB/都可以去匹配;但是匹配字符串1的话,只会匹配到AAA,因为除非使用全局模式标志,在完成第一次匹配后不会再进行后面的匹配了,包括字符和字符类以及所有的匹配方式都是这样。
5、重复类
字符类都只能匹配一个字符,如“[0-9]”只能匹配数字0到9,如果要匹配数字10到99就不行了;正则表达式提供了重复类来匹配这种重复的现象;比如重复类“{n}”可以将前一项重复n次;
/[\d]{2}/ 将“[\d]”重复两次,相当于“/[\d][\d]/”
/ab{2}/ 将“b”重复两次,相当于“/abb/”
在正则表达式“/[\d]{2}/”中可以匹配到00到99之间的数字,但如果0到99之间的数字需要用“/[\d]|[\d]{2}/”
/[\d]{1,3}/ 将“[\d]”重复1到3次,相当于“/[\d]/”或“/[\d][\d]/”或“/[\d][\d][\d]/”
/ab{1,3}/ 将“b”重复1到3次,相当于“/ab/”或“/abb/”或“/abbb/”
更多重复类:1、{n}:匹配前一项n次;2、{n,m}:匹配前一项n到m次;3、{n,}:匹配前一项至少n次;4、?:酦醅前一项0次或者1次,相当于{0,1};5、+:匹配前一项至少1次,相当于{1,};6、*:匹配前一项0次货多次,相当于{0,};
6、分组
假设要匹配字符串“java”或“javascript”,除了选择符,还可以使用小括号将字符串分组来实现,分了组的字符串可以看成一个整体;
比如:/java(script)?/,“script”被小括号括起来视为一个整体,又因为重复类“?”会将整个“script”重复0次或者1次,所以可以匹配字符串“java”或“javascript”。
7、引用
在正则表达式中,会给每一个分组分配一个编号,使用编号可以将匹配到的内容在正则表达式中作进一步的处理;编号方式为:从正则表达式左侧开始,第一个分组编号为1,第二个为2,以此类推;
分组编号后,可以使用“\n”来引用分组匹配的字符串;如“\1”位第一个分组匹配的字符串;/(java)?Script\1:,该正则表达式可以匹配到“javascriptjava”或“script”;
在某些情况下,可能要将匹配到的字符串分组,但不记录该组匹配的字符串,那么久可以使用“(?)”符号类进行分组,比如:/(?:java){0,1}(Script){0,1}\1/,可以匹配到“java”或“JavaScriptScript”。
8、其他匹配
正则表达式中海油两种选择性匹配:
x(?=y):只有x后面紧跟着y才匹配;
x(?!y):只有x后面不是y才匹配。
9、匹配规则
正则表达式在匹配字符串时,只要遇上可以匹配的内容就会停止匹配;如果想要继续匹配的话,就必须在正则表达式后加上标志符“g”,如/a/g;
更多标志符:1、i:匹配时不区分大小写;2、g:匹配能匹配的所有字符,而不是在匹配第一个后就停止匹配;3、m:执行多行匹配模式,也就是使用“^”和“$”来匹配开头和结尾。