网站推广合同模板,上海发布微信公众号,江阴做网站哪家好,温州网站设计只找亿企邦目录
元字符
连接符
限定符
定位符
修饰符#xff08;标记#xff09;
运算符优先级
普通字符集及其替换
零宽断言
正向先行断言
负向先行断言
正向后发断言
负向后发断言
捕获组
普通捕获组
命名捕获组
PS:非捕获组 正则表达式在线测试: 正则在线测试工具 …目录
元字符
连接符
限定符
定位符
修饰符标记
运算符优先级
普通字符集及其替换
零宽断言
正向先行断言
负向先行断言
正向后发断言
负向后发断言
捕获组
普通捕获组
命名捕获组
PS:非捕获组 正则表达式在线测试: 正则在线测试工具
元字符
字符描述\d 匹配一个数字字符。等价于 [0-9]。 \D 匹配一个非数字字符。等价于 [^0-9]。 \s 匹配任何空白字符包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 \w 匹配字母、数字、下划线。等价于[A-Za-z0-9_]。 \W 匹配非字母、数字、下划线。等价于 [^A-Za-z0-9_]。 \n 匹配一个换行符。等价于 \x0a 和 \cJ。 \r 匹配一个回车符。等价于 \x0d 和 \cM。 \t 匹配一个制表符。等价于 \x09 和 \cI。 \f 匹配一个换页符。等价于 \x0c 和 \cL。 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如n 匹配字符 n。\n 匹配一个换行符。序列 \\ 匹配 \ 而 \( 则匹配 (。 . 匹配除换行符\n、\r之外的任何单个字符。要匹配包括 \n 在内的任何字符请使用像(.|\n)的模式。 [ ] 字符种类。匹配方括号内的任意字符。 [^ ] 否定的字符种类。匹配除了方括号里的任意字符 连接符
字符描述[0-9]匹配数字,等价于\d[a-z]匹配英文小写字母[A-Z] 匹配英文大写字母 [0-9a-zA-z]匹配数字或英文字母[\u4e00-\u9fa5]匹配一个汉字 限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
正则表达式的限定符有
字符描述*匹配前面的子表达式零次或多次。例如zo* 能匹配 z 以及 zoo。* 等价于 {0,}。匹配前面的子表达式一次或多次。例如zo 能匹配 zo 以及 zoo但不能匹配 z。 等价于 {1,}。? 匹配前面的子表达式零次或一次。例如do(es)? 可以匹配 do 、 does、 doxy 中的 do 和 does。? 等价于 {0,1}。 {n}n 是一个非负整数。匹配确定的 n 次。例如o{2} 不能匹配 Bob 中的 o但是能匹配 food 中的两个 o。{n,}n 是一个非负整数。至少匹配n 次。例如o{2,} 不能匹配 Bob 中的 o但能匹配 foooood 中的所有 o。o{1,} 等价于 o。o{0,} 则等价于 o*。{n,m}m 和 n 均为非负整数其中 n m。最少匹配 n 次且最多匹配 m 次。例如o{1,3} 将匹配 fooooood 中的前三个 o。o{0,1} 等价于 o?。请注意在逗号和两个数之间不能有空格。 定位符
定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。
定位符用来描述字符串或单词的边界^ 和 $ 分别指字符串的开始与结束\b 描述单词的前或后边界\B 表示非单词边界。
正则表达式的定位符有
字符描述^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性^ 还会与 \n 或 \r 之后的位置匹配。$匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性$ 还会与 \n 或 \r 之前的位置匹配。\b匹配一个单词边界即字与空格间的位置。\B非单词边界匹配。
注意不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置因此不允许诸如 ^* 之类的表达式。
若要匹配一行文本开始处的文本请在正则表达式的开始使用 ^ 字符。不要将 ^ 的这种用法与中括号表达式内的用法混淆。 修饰符标记
标记也称为修饰符正则表达式的标记用于指定额外的匹配策略。
标记不写在正则表达式里标记位于表达式之外格式如下
修饰符含义描述iignore - 不区分大小写将匹配设置为不区分大小写搜索时不区分大小写: A 和 a 没有区别。gglobal - 全局匹配查找所有的匹配项。mmulti line - 多行匹配使边界字符 ^ 和 $ 匹配每一行的开头和结尾记住是多行而不是整个字符串的开头和结尾。s特殊字符圆点 . 中包含换行符 \n默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符加上 s 修饰符之后, . 中包含换行符 \n。
运算符优先级
正则表达式从左到右进行计算并遵循优先级顺序这与算术表达式非常类似。
相同优先级的从左到右进行运算不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序
运算符描述\转义符(), (?:), (?), []圆括号和方括号*, , ?, {n}, {n,}, {n,m}限定符^, $, \任何元字符、任何字符定位点和序列即位置和顺序|替换或操作 字符具有高于替换运算符的优先级使得m|food匹配m或food。若要匹配mood或food请使用括号创建子表达式从而产生(m|f)ood。 普通字符集及其替换
符号替换正则描述\d[0-9]匹配数字字符\D[^0-9]匹配非数字字符\w0-9a-zA-z]匹配数字或字母或下划线\W[^\w]匹配非数字或字母或下划线\s[\r\t\n\f]匹配任意的空白符如空格换行符制表符等\S[^\s]匹配任意不是空白符的字符 零宽断言
所谓断言是用来声明一个应该为真的事实。在正则表达式中只有当断言为真时才会继续进行匹配。零宽断言像用于查找某些内容之前或者之后的东西其中一些特殊字符如“\b、^、$”等用于指定一个位置这个位置应满足一定的条件。
正向先行断言
(?pattern) 匹配 pattern 之前的位置即要想满足匹配后面得跟着 pattern 负向先行断言
(?!pattern) 匹配 pattern 之前的位置即要想满足匹配后面不能跟着 pattern 正向后发断言
(?pattern) 匹配 pattern 之后的位置即要想满足匹配前面得跟着 pattern 负向后发断言
(?!pattern) 匹配 pattern 之后的位置即要想满足匹配前面不能跟着 pattern 规律 所谓”正”即字符中需要出现 pattern 所谓“负”即字符中不能出现 pattern 所谓“先”即匹配在 pattern 前的位置 所谓“后”即匹配在 pattern 后的位置 捕获组
捕获组分为
普通捕获组(Expression)命名捕获组(?Expression)
普通捕获组
从正则表达式左侧开始每出现一个左括号(记做一个分组分组编号从 1 开始。0 代表整个表达式。
对于时间字符串2017-04-25表达式如下 (\\d{4})-((\\d{2})-(\\d{2})) 有 4 个左括号所以有 4 个分组:
编号捕获组匹配0(\d{4})-((\d{2})-(\d{2}))2017-04-251(\d{4})20172((\d{2})-(\d{2}))04-253(\d{2})044(\d{2})25
public static final String DATE_STRING 2017-04-25;
public static final String P_COMM (\\d{4})-((\\d{2})-(\\d{2}));Pattern pattern Pattern.compile(P_COMM);
Matcher matcher pattern.matcher(DATE_STRING);
matcher.find();//必须要有这句System.out.printf(\nmatcher.group(0) value:%s, matcher.group(0));
System.out.printf(\nmatcher.group(1) value:%s, matcher.group(1));
System.out.printf(\nmatcher.group(2) value:%s, matcher.group(2));
System.out.printf(\nmatcher.group(3) value:%s, matcher.group(3));
System.out.printf(\nmatcher.group(4) value:%s, matcher.group(4));命名捕获组
每个以左括号开始的捕获组都紧跟着 ?而后才是正则表达式。
对于时间字符串2017-04-25表达式如下: (?year\\d{4})-(?md(?month\\d{2})-(?date\\d{2})) 有 4 个命名的捕获组分别是:
编号名称捕获组匹配00(?\d{4})-(?(?\d{2})-(?\d{2}))2017-04-251year(?\d{4})-20172md(?(?\d{2})-(?\d{2}))04-253month(?\d{2})044date(?\d{2})25
命名的捕获组同样也可以使用编号获取相应值。
public static final String P_NAMED (?year\\d{4})-(?md(?month\\d{2})-(?date\\d{2}));
public static final String DATE_STRING 2017-04-25;
Pattern pattern Pattern.compile(P_NAMED);
Matcher matcher pattern.matcher(DATE_STRING);
matcher.find();System.out.printf(\n使用名称获取);
System.out.printf(\nmatcher.group(0) value:%s, matcher.group(0));
System.out.printf(\n matcher.group(year) value:%s, matcher.group(year));
System.out.printf(\nmatcher.group(md) value:%s, matcher.group(md));
System.out.printf(\nmatcher.group(month) value:%s, matcher.group(month));
System.out.printf(\nmatcher.group(date) value:%s, matcher.group(date));matcher.reset();System.out.printf(\n使用编号获取);
matcher.find();
System.out.printf(\nmatcher.group(0) value:%s, matcher.group(0));
System.out.printf(\nmatcher.group(1) value:%s, matcher.group(1));
System.out.printf(\nmatcher.group(2) value:%s, matcher.group(2));
System.out.printf(\nmatcher.group(3) value:%s, matcher.group(3));
System.out.printf(\nmatcher.group(4) value:%s, matcher.group(4));PS:非捕获组
在左括号后紧跟 ?:而后再加上正则表达式构成非捕获组 (?:Expression)。
对于时间字符串2017-04-25表达式如下: (?:\\d{4})-((\\d{2})-(\\d{2})) 这个正则表达式虽然有四个左括号理论上有 4 个捕获组。但是第一组 (?:\d{4})其实是被忽略的。当使用 matcher.group(4) 时系统会报错。
编号捕获组匹配0(\d{4})-((\d{2})-(\d{2}))2017-04-251((\d{2})-(\d{2}))04-252(\d{2})043(\d{2})25
public static final String P_UNCAP (?:\\d{4})-((\\d{2})-(\\d{2}));
public static final String DATE_STRING 2017-04-25;Pattern pattern Pattern.compile(P_UNCAP);
Matcher matcher pattern.matcher(DATE_STRING);
matcher.find();System.out.printf(\nmatcher.group(0) value:%s, matcher.group(0));
System.out.printf(\nmatcher.group(1) value:%s, matcher.group(1));
System.out.printf(\nmatcher.group(2) value:%s, matcher.group(2));
System.out.printf(\nmatcher.group(3) value:%s, matcher.group(3));// Exception in thread main java.lang.IndexOutOfBoundsException: No group 4
System.out.printf(\nmatcher.group(4) value:%s, matcher.group(4));
总结
普通捕获组使用方便命名捕获组使用清晰非捕获组目前在项目中还没有用武之地。