黑马程序员技术交流社区

标题: 求一个正则表达式 [打印本页]

作者: chenlanaq    时间: 2015-3-31 10:58
标题: 求一个正则表达式
本帖最后由 chenlanaq 于 2015-3-31 11:43 编辑

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

作者: major2015    时间: 2015-3-31 10:58
求奖励

  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. }
复制代码

作者: yi岁⑨很乖❤    时间: 2015-3-31 13:44
  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.                 }
复制代码


希望我的详细解答可以帮助你哦~ :#
作者: 通往牛逼的路上    时间: 2015-3-31 20:51
说一下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](减去)

说明:
[]表示范围--某一个字符的范围
^表示非
&&表示

作者: chenlanaq    时间: 2015-4-1 09:06
我需要的是一个正则表达式。。
作者: 青青竹竿    时间: 2015-4-3 18:25
直接弄不出来吧
先全局匹配   \d{6}   
再 查找  (\d)\d*\1  匹配项如果没有的话就是6个不同的数字
非要捕获数字的话 全局匹配改成(/d)(/d)(/d)(/d)(/d)(/d) 可以捕获
作者: 右手年华    时间: 2015-4-4 00:21
还没学到呢,
作者: 明日天涯    时间: 2015-4-15 22:17
^(?:([0-9])\1{5})$
作者: itheima_llt    时间: 2015-4-17 12:35
楼上的都是大神,厉害,学习了。
作者: One_M    时间: 2015-4-19 01:09
话说 这个 貌似没学到的说..




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2