常 用 匹 配 符
^ 匹配起始位置或每行开始,或是否定如[^a]表示除a之外的
$ 匹配结束位置或每行结束
. 匹配除了换行符以外的任何字符
[] 匹配包含括号内元素的字符 [ab]等价(a|b),在方括号中,不需要转义字符如[']匹配一个单引号
\b 匹配一个位置,不会消耗任何字符,常用于匹配单词边界
\d 匹配数字
\w 匹配字母,数字,下划线
\s 匹配空格,制表符等空白符 等价于 \f\n\r\t\v
[^abc] 匹配除了abc以外的任意字符
\B 表示与小写相反
\D 表示与小写相反
\W 表示与小写相反
\S 表示与小写相反
量 词
{} 表示前导对象的数量 {n} 重复n次,{n,m}重复n到m次{n,}大于等于n
? 表示1个或0个 <==>{0,1} +?,*?,??,C19{}?表示在遇到下一个匹配符之前尽可能多的匹配
+ 表示1个或n个 <==>{1,}
* 表示0个或n个 <==>{0,}
捕 获分组与预查
(pattern) 匹配pattern,并捕获文本到自动命名的组里, js和java中可以使用$0-$9取出匹配的字符,如aa1 ,([a-z])\1可以匹配到aa,\1是对括号中匹配到的字符的引用
(?<name>pattern) 匹配pattern,并捕获文本到名称为name的组里 如:(?<aaa>[a-z])\k<aaa>可以匹配到aa,\k<aaa>是对括号中匹配到的字符的引用,捕获分组的名称是aaa
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号 匹配的内容与(exp)一样,一般用于“industr(?:y|ies)”等价于“industry|industries”
(?=exp) 匹配exp前面的位置 如 How are you doing 正则 (?<txt>.+(?=ing)) 这里取ing前所有的字符,并定义了一个捕获分组名字为 txt 而 txt 这个组里的值为 How are you do ;
(?<=exp) 匹配exp后面的位置 如 How are you doing 正则 (?<txt>(?<=How).+) 这里取 How 之后所有的字符,并定义了一个捕获分组名字为 txt 而 txt 这个组里的值为 are you doing ;
(?<!exp) 匹配前面不是exp的位置 如 “(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”
(?!exp) 匹配后面跟的不是exp的位置 如 123abc 正则 \d{3}(?!\d) 匹配3位数字后非数字的结果
不常用匹配符
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
PHP的正则表达式有一些内置的通用字符簇,如下:
[[:alpha:]] 任何字母
[[:digit:]] 任何数字
[[:alnum:]] 任何字母和数字
[[:space:]] 任何白字符
[[:upper:]] 任何大写字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]
各种操作符的运算优先级
相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:
操作符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和顺序 【 anymetacharacter 表示任何元字符】
| “或”操作
JavaScript中使用正则表达式
支持正则表达式的 String 对象的方法
-
使用search()
用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。 如果没有找到任何匹配的子串,则返回 -1。如果找到返回首次找到的位置 var str = "Visit w3cschool"; var n = str.search(/w3cschool/i); console.log(n); 输出结果:6 i为修饰符,对应单词 ignore ,表示忽略大小写
-
使用match()
查找字符串是否匹配给定的匹配模式,如过匹配到返回一个数组(包含匹配到的字符串等信息), 否则返回null,其中的参数匹配模式中如果包含g则匹配所有的匹配串,否则返回首次匹配到的结果及位置信息。 (ps:匹配模式中的m即多行匹配,会对多行进行匹配,但在全部字符串中遇到第一个匹配后不再继续匹配) var str="a123ccad"; var n=str.match(/[a][a-z-1-9]/);//与var n=str.match(/[a][a-z-1-9]/m); console.log(n) 输出结果: ["a1", index: 0, input: "a123ccad", groups: undefined] var str="a123ccad"; var n=str.match(/[a][a-z-1-9]/g); console.log(n) 输出结果: ["a1", "ad"]
-
使用split()
语法 :string.split(separator,limit) 用于把一个字符串分割成字符串数组,返回一个数组。 separator 可选。字符串或正则表达式。 limit 可选。该参数可指定返回的数组的最大长度。 var str="How are you doing today?"; var n=str.split(" ",3); console.log(n) 返回结果:["How", "are", "you"] var str="How are you doing today?"; var n=str.split(); console.log(n) 返回结果:["How are you doing today?"] (ps:如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。 split() 方法不改变原始字符串。)
-
使用replace()
var str = "Visit Microsoft!\nVisit Microsoft!"; var res = str.replace(/microsoft/gi, "w3cschool"); console.log(res); 输出结果:Visit w3cschool! (ps:gi 为修饰符,g表示全局匹配(查找所有匹配而非在找到第一个匹配后停止),即global,i表示忽略大小写) var str = "Visit Microsoft!\nVisit Microsoft!"; var res = str.replace(/mic(r)osoft/gi, "w3cschool"+RegExp.$1); console.log(res); 输出结果:Visit w3cschooli! (ps: 其中RegExp.$1代表匹配模式中小括号内匹配到的值,$1~$9分别代表第一到第九个分组内的值)
RegExp 对象
-
生成RegExp对象
var patt = /microsoft/gi; var patt = new RegExp("e"); //var patt = /e/; var patt = new RegExp(pattern,modifiers); //var pattern = new RegExp('microsoft','gi'); 使用RegExP对象之后可以使用RegExP.$1去第一个分组内的值,1-9一次类推。
-
test()方法
搜索字符串指定的值,根据结果并返回真或假。 var str = "Visit Microsoft!\nVisit Microsoft!"; var patt = /microsoft/gi; // console.log(patt.test(str)); 输出结果:true
-
exec() 方法
检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。 var patt1=new RegExp("e"); console.log(patt1.exec("The best things in life are free")); 输出结果:e var patt = new RegExp("RUNOOB", "g"); var res = patt.toString(); console.log(res ); 输出结果:/RUNOOB/g
Java中使用正则表达式
-
查找
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexTest { public static void main(String[] args) { String regexEmotion = "([1-9][0-9]{3})[^1-9]*?([1][0-2]|[0]?[1-9])[^1-9]*?([3][01]|[1-2][0-9]|[0]?[1-9])"; Pattern patternEmotion = Pattern.compile(regexEmotion); String spannableString = "fjkashfjaj jsd 计划书2019 -0131"; Matcher matcherEmotion = patternEmotion.matcher(spannableString); while (matcherEmotion.find()) { System.out.println(matcherEmotion.group(1)+ matcherEmotion.group(2) + matcherEmotion.group(3)); } } } 输出:20190131
-
替换
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexTest { public static void main(String[] args) { String regexEmotion = "([0-9]{4})(-)"; Pattern patternEmotion = Pattern.compile(regexEmotion); String spannableString = "0131-"; Matcher matcherEmotion = patternEmotion.matcher(spannableString); if(matcherEmotion.find()){ spannableString = spannableString.replaceAll(regexEmotion,"$1"+"$2"+"$1"); System.out.println(spannableString); } } } 输出:0131-0131