(2)正则组

前端之家收集整理的这篇文章主要介绍了(2)正则组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

分组的概念:用()括起来的就叫一个组

分组的作用:按组获取匹配的字符串

例子:从字符串 "我好有钱,银行存款123¥"中分别截取出123、¥

  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;
  3.  
  4. public class CapturingGroups {
  5.  
  6. public static void main(String[] args) {
  7. //分组的概念
  8. CapturingGroups.testRegGroup("(\\d+)([¥$])","我好有钱,银行存款123¥");
  9. }
  10. public static void testRegGroup(String reg,String resource) {
  11. Pattern p = Pattern.compile(reg);
  12. Matcher m = p.matcher(resource);
  13. System.out.println("()表示一组:m.groupCount: " + m.groupCount());
  14. while(m.find()) {
  15. System.out.println("group(0)==group()表示整体匹配,value=" + m.group(0));
  16. for(int i=1; i<=m.groupCount(); i++) {
  17. System.out.print("m.group("+i+")=" + m.group(i) + ",");
  18. }
  19. System.out.println();
  20. }
  21.  
  22. }
  23.  
  24. }

输出

  1. ()表示一组:m.groupCount: 2
  2. group(0)==group()表示整体匹配,value=123
  3. m.group(1)=123,m.group(2)=¥,

非捕获组:不用于捕获数据的组,那有啥用呢?看例子

  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;
  3.  
  4. /**
  5. * 正则表达式非捕获组
  6. * 特殊构造(非捕获) (JDK API说明)
  7. * 1.(?:X) X,作为非捕获组
  8. * 2.(?idmsux-idmsux) Nothing,但是将匹配标志i d m s u x on - off
  9. * 3.(?idmsux-idmsux:X) X,作为带有给定标志 i d m s u x on - off
  10. * 4.(?=X) X,通过零宽度的正 lookahead
  11. * 5.(?!X) X,通过零宽度的负 lookahead
  12. * 6.(?<=X) X,通过零宽度的正 lookbehind
  13. * 7.(?<!X) X,通过零宽度的负 lookbehind
  14. * 8.(?>X) X,作为独立的非捕获组
  15. *
  16. */
  17. public class NonCapturingGroups {
  18. public static void main(String args[]) {
  19. //1.(?:)不记录组号
  20. NonCapturingGroups.testRegExp("(\\d+)(\\.?)(\\d+)([¥$])$","123.43$",new int[]{1,4});
  21. NonCapturingGroups.testRegExp("(\\d+)(?:\\.?)(?:\\d+)([¥$])$",2});
  22. //2.3 用于标志匹配,比如:(?i) 打开不区分大小写开关;(?-i) 关闭标志,恢复不区分大小写
  23. // 正则可改写成:(?i:abc)def 或者 (?i)abc(?-i:def)
  24. // 没有(?-1)时,没有关闭,可匹配AbcDef
  25. // NonCapturingGroups.testRegExp("(?i)abc(?-i)def","Abcdef");
  26. //4.5 !为=取反
  27. //(?=) 在前面,输出ba,4--6. 表示以b开头,结果集中包含b
  28. // 试试(?=b)a,永远无输出 再试下(?=b)b a(?=b),观察输出,自己分析下!!!!!!!!
  29. // NonCapturingGroups.testRegExp("(?=b).{2}","aacabaaqq");
  30. //(?=) 在后面,输出ac,2--4. 表示以2字符后面紧跟b,不捕获b
  31. // NonCapturingGroups.testRegExp(".{2}(?=b)","aacabaaqq");
  32. // NonCapturingGroups.testRegExp(".{2}(?=b).{2}","aacabaaqq");
  33. //6.7
  34. // lookahead: 前面紧跟 ; lookbehind: 后面紧跟
  35. // NonCapturingGroups.testRegExp(".{2}(?=b)","aacabaaqq");
  36. // NonCapturingGroups.testRegExp(".{2}(?<=b)","aacabaaqq"); //获取b前紧跟2字符
  37. // NonCapturingGroups.testRegExp(".{2}(?<=b).{2}","aacabaaqq"); // 获取b后紧跟2字符
  38. //8.(?>) 匹配失败,跳过
  39. // NonCapturingGroups.testRegExp("a(bc|b)c","abc");
  40. // NonCapturingGroups.testRegExp("a(?>bc|b)c","abc");
  41. }
  42. /**
  43. * @param regExp: 正则表达式
  44. * @param resource: 源字符串
  45. */
  46. public static void testRegExp(String regExp,String resource) {
  47. Pattern p = Pattern.compile(regExp);
  48. Matcher m = p.matcher(resource);
  49. int count = 0;
  50. while(m.find()) {
  51. count ++;
  52. System.out.println(m.group());
  53. System.out.println(m.start() + "---" + m.end());
  54. }
  55. if(count == 0)
  56. System.out.println("not find");
  57. }
  58. /**
  59. * @param regExp: 正则表达式
  60. * @param resource: 源字符串
  61. * @param groups: 输出组号
  62. */
  63. public static void testRegExp(String regExp,String resource,int[] groups) {
  64. Pattern p = Pattern.compile(regExp);
  65. Matcher m = p.matcher(resource);
  66. while(m.find()) {
  67. if(null == groups)
  68. groups = new int[]{0};
  69. for(int i=0; i<groups.length; i++) {
  70. System.out.print(m.group(groups[i]) + " ");
  71. }
  72. System.out.println();
  73. }
  74. }
  75. }

非捕获组细节比较多,对照代码输出,分析下就清楚了。占不清楚应用场景。

参考:http://blog.csdn.net/chunlin304/article/details/7238905
http://www.jb51.cc/article/p-tnmqccyo-vp.html

猜你在找的正则表达式相关文章