A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chenlanaq 初级黑马   /  2015-3-31 10:58  /  3809 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
本帖最后由 chenlanaq 于 2015-3-31 11:43 编辑

要求匹配6个不同的数字并捕获每个数字。最好能给出解释

最佳答案

9 个回复

倒序浏览
求奖励

  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;

  3. /*
  4. * 我理解楼主的意思是要在一串数字字符串中匹配6个不同的数字并捕获每个数字
  5. * 不知道对不???
  6. *
  7. */
  8. public class Regex2 {
  9.        
  10.         public static void main(String[] args) {

  11.                 /*
  12.                  * 解释:        regex = "(((((\\d)[^$1])[^$2])[^$3])[^$4])[^$5]"
  13.                  *
  14.                  * 首先
  15.                  * 第一个为数字,所以为\\d
  16.                  * 然后第二个数字不能与第一个数字相同,把第一个封装成组,对组表示的值取非 ,所以 (\\d)[^$1],匹配2个不同数字
  17.                  * 然后第三个数字不能与第一个,第二个相同,把第一个和第二个封装成组,对组取非,所以((\\d)[^$1])[^$2],匹配3个不同数字
  18.                  * 。。。以此类推,就可以匹配6个不同数字了
  19.                  *
  20.                  * 如果楼主不知道不清楚 组,$n,^ ,[]的概念,可以查看api文档,或者追问
  21.                  *
  22.                  * 等待楼主的奖励,^-^
  23.                  *  
  24.                  */
  25.                 String str = "1123456234589";//结果为123456,234589
  26.                 String regex = "(((((\\d)[^$1])[^$2])[^$3])[^$4])[^$5]";
  27.                 Pattern p = Pattern.compile(regex);
  28.                 Matcher m = p.matcher(str);
  29.                 while (m.find()) {
  30.                         System.out.println(m.group());
  31.                 }
  32.                
  33.         }
  34. }
复制代码
回复 使用道具 举报
  1. /**
  2.                  * 解题思路:
  3.                  * 1. 定义一个数组,默认初始值为0,当匹配到是数字的时候,将这个数字对应的数组角标置为1,这个动作是为了去重复数字;
  4.                  * 2. 使用正则表达式获取字符串中的数字
  5.                  *           (1)将正则表达式封装成为对象 Pattern【Pattern的静态方法compile()】
  6.                  *    (2)让正则对象和要操作的字符串相关联的返回Matcher对象【Pattern数字的matcher()方法】
  7.                  *    (3)关联后,获取匹配引擎【 Matcher对象的find()方法】
  8.                  *    (4)通过引擎对符合规则的子串进行取出操作【 Matcher对象的group()方法】
  9.                  */
  10.                
  11.                 int[] arr = new int[10]; //定义数组,默认初始值为0
  12.                
  13.                 String str = "das41da2da6da1das2da17891236458460";
  14.                 String reg = "[0-9]"; //正则表达式规则为:0~9的数字,你可以自己定义想要的数字
  15.                
  16.                 Pattern p = Pattern.compile(reg); //将规则封装成对象
  17.                 Matcher m = p.matcher(str); //获取匹配器对象
  18.                 while(m.find()) //根据规则查找数字
  19.                 {
  20.                         int index = Integer.parseInt(m.group()); //将匹配结果转换为整型赋值给数组角标
  21.                         if(arr[index] == 0) //去重复数字
  22.                         {
  23.                                 arr[index] = 1;
  24.                                 System.out.print(index + "\t");
  25.                         }
  26.                 }
复制代码


希望我的详细解答可以帮助你哦~ :#
回复 使用道具 举报
说一下java正则表达式的重点概念:
第一、相关类:Pattern、Matcher
第二、典型的调用顺序是
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。
语句 boolean b = Pattern.matches("a*b", "aaaaab");等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
此类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。

第三、正则表达式的构造摘要
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)

说明:
[]表示范围--某一个字符的范围
^表示非
&&表示
回复 使用道具 举报
我需要的是一个正则表达式。。
回复 使用道具 举报
直接弄不出来吧
先全局匹配   \d{6}   
再 查找  (\d)\d*\1  匹配项如果没有的话就是6个不同的数字
非要捕获数字的话 全局匹配改成(/d)(/d)(/d)(/d)(/d)(/d) 可以捕获
回复 使用道具 举报
右手年华 来自手机 中级黑马 2015-4-4 00:21:13
7#
还没学到呢,
回复 使用道具 举报
^(?:([0-9])\1{5})$
回复 使用道具 举报
楼上的都是大神,厉害,学习了。
回复 使用道具 举报
One_M 中级黑马 2015-4-19 01:09:22
10#
话说 这个 貌似没学到的说..
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马