正则表达式之(exp)、(?:exp)、(?=exp)、(?<=exp)理解
2017-01-04 10:29
302 查看
先澄清下如下俩个概念:
1、分组(或捕获组)
分组的定义
正则表达式通过使用括号将表达式分为不同的分组,识别的方法是通过从左至右搜寻左半括号,遇到第一个左半括号时,则该左半括号与对应的右半括号所包含的内容即为第一分组,以此类推 。例如,在表达式((A)(B(C))),有四个这样的组:((A)(B(C)))、(A)、(B(C))、(C)
分组存在意义
向后引用:在第i个分组中被匹配的字符串,可以在在正则表达式中通过\i方式再次引用,例如\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go
go, 或者kitty kitty。
分组取值:当通过正则表达式匹配到字符串时,可以使用matcher.group(i)等方式取到第i个分组所匹配到的子字符串。
2、位置类元数据
即像^、$、\b、\B这样的元字符,是用来表示一个位置。作为一个判断条件,匹配的字符需要满足这样的位置信息,但最终匹配的字符串中并不会包含这个样的位置信息。这也是与其他一些元字符所区别的地方,例如表达式中出现\d这样元字符,则最终匹配的字符串中必定需要有数字出现,而\b(\w+)\b表达式匹配的字符串仅仅是一个完整的单词,而不会出现空格等字符来表达位置信息。
其实清楚上面俩个概念后,下面的也就不难理解了:
(exp) :目标字符串需要匹配exp,并将该分组匹配的子文本保存到自动命名的组里;
(?<name>exp):目标字符串需要匹配exp,并将该分组匹配的子文本保存到名称为name的组里,也可以写成(?'name'exp);
(?:exp) :目标字符串需要匹配exp, 该括号所包括的内容不会被作为一个分组对待, 即不给此“分组”分配组号,也不会并将该”分组”匹配的子文本保存;该表达式与(exp)在效果上其实应该是没有区别的,区别只是是否算作一个分组及是否保存匹配的子文本。
(?=exp) :定义目标字符串结束位置要求,即紧随目标字符串后面出现的字符串需要匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;
(?<=exp):定义目标字符串起始位置要求,即紧邻目标字符串前面出现的字符串需要匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;
(?!exp):定义目标字符串结束位置要求,即紧随目标字符串后面出现的字符串不能匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;效果上与(?=exp)
表示的情况刚好相反;
(?<!exp):定义目标字符串起始位置要求,即紧邻目标字符串前面出现的字符串不能匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;效果上与(?<=exp)表示的情况刚好相反;
参考资料:
(1)http://www.runoob.com/java/java-regular-expressions.html
(2)http://deerchao.net/tutorials/regex/regex.htm
内容中没有什么废话,能让你快速的了解基础用法
1、分组(或捕获组)
分组的定义
正则表达式通过使用括号将表达式分为不同的分组,识别的方法是通过从左至右搜寻左半括号,遇到第一个左半括号时,则该左半括号与对应的右半括号所包含的内容即为第一分组,以此类推 。例如,在表达式((A)(B(C))),有四个这样的组:((A)(B(C)))、(A)、(B(C))、(C)
分组存在意义
向后引用:在第i个分组中被匹配的字符串,可以在在正则表达式中通过\i方式再次引用,例如\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go
go, 或者kitty kitty。
分组取值:当通过正则表达式匹配到字符串时,可以使用matcher.group(i)等方式取到第i个分组所匹配到的子字符串。
2、位置类元数据
即像^、$、\b、\B这样的元字符,是用来表示一个位置。作为一个判断条件,匹配的字符需要满足这样的位置信息,但最终匹配的字符串中并不会包含这个样的位置信息。这也是与其他一些元字符所区别的地方,例如表达式中出现\d这样元字符,则最终匹配的字符串中必定需要有数字出现,而\b(\w+)\b表达式匹配的字符串仅仅是一个完整的单词,而不会出现空格等字符来表达位置信息。
其实清楚上面俩个概念后,下面的也就不难理解了:
(exp) :目标字符串需要匹配exp,并将该分组匹配的子文本保存到自动命名的组里;
(?<name>exp):目标字符串需要匹配exp,并将该分组匹配的子文本保存到名称为name的组里,也可以写成(?'name'exp);
(?:exp) :目标字符串需要匹配exp, 该括号所包括的内容不会被作为一个分组对待, 即不给此“分组”分配组号,也不会并将该”分组”匹配的子文本保存;该表达式与(exp)在效果上其实应该是没有区别的,区别只是是否算作一个分组及是否保存匹配的子文本。
(?=exp) :定义目标字符串结束位置要求,即紧随目标字符串后面出现的字符串需要匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;
(?<=exp):定义目标字符串起始位置要求,即紧邻目标字符串前面出现的字符串需要匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;
(?!exp):定义目标字符串结束位置要求,即紧随目标字符串后面出现的字符串不能匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;效果上与(?=exp)
表示的情况刚好相反;
(?<!exp):定义目标字符串起始位置要求,即紧邻目标字符串前面出现的字符串不能匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;效果上与(?<=exp)表示的情况刚好相反;
参考资料:
(1)http://www.runoob.com/java/java-regular-expressions.html
(2)http://deerchao.net/tutorials/regex/regex.htm
内容中没有什么废话,能让你快速的了解基础用法
相关文章推荐
- 正则表达式问题:如何理解/href\s*=\s*(?:"(?<1>[^"]*)"|(?<1>\S+))/(转载)
- javascript正则表达式中 (?=exp)、(?<=exp)、(?!exp)
- 理解正则表达式(程序员第3期文章)
- 正则表达式:过滤<font>和</font>
- 正则表达式 <A HREF>
- 我对正则表达式的理解
- 正则表达式验证日期时间<转>
- 正则表达式:过滤<font>和</font>
- C#正则表达式使用<转载备用>
- GP AS-PATH的正则表达式的理解
- 正则表达式 捕获组理解
- 理解正则表达式(程序员第3期文章)
- 正则表达式需要灵活理解——Perl学习中
- BGP AS-PATH的正则表达式的理解
- <转载>电话号码正则表达式
- 理解正则表达式(程序员第3期文章)
- C#中利用正则表达式实现字符串搜索<转>
- 正则表达式 匹配"<"方法!
- oracle 正则表达式<转>
- 理解 Java 正则表达式怪异的 // 和 ////,让您见怪不怪