最近在做播放器,用系统的方法过滤选出sd卡上的音乐文件,发现有好多文件都只是一些无用的音频文件,采用
"^\\w+\\d.{5,}|\\w"
来过滤歌曲名,但奇怪为什么“b222aa2“这种形式的也可以匹配上呢?懂得给解释下,谢谢了。

解决方案 »

  1.   

    正则被竖线分为两部分
    第一部分 ^\w+\d.{5,} 
    ^\w+表示 由一个以上的单词字符(大小写字母及数字)开头 
    \d表示有一个数字 
    .{5,}表示一个任意字符出现至少五次第二部分
    \w 一个单词字符这两个部分是或的关系 对于任何能够匹配第一部分或者第二部分的字符串 都可以匹配上整个正则
    b222aa2 是怎么匹配上的呢? 第二部分只有一个字符显然不是和它匹配
    ^\w+  -> b     // 至少一个单词字符
    \d    -> 2     // 一个数字
    .{5,} -> 22aa2 // 刚好是5个任意字符
    关于Java中正则表达式的使用 可以参考我的译文 
    http://blog.csdn.net/cugbabybear/article/details/14170355
      

  2.   


    首先多谢回复,按你所说的去理解,我看了下确实可以匹配上。但我现在还有疑惑在向你请教下。我最开始的正则是这样写的:
    ^\\w+\\d{5,}|\\w
    目的是过滤掉以英文字符开头并且含5个以上数字的字符串,但发现没有过滤掉形如,0604a_3907413nGf,BBC0702_243243223snP,
    201206cet4。前两个因为包含"_"的原因没匹配上,但为什么201206cet4也没能匹配上呢?或者你有更好的表达式吗?
      

  3.   


    因为元字符 \w 中包括字母和数字字符 你可以将\w改为[a-zA-Z]
      

  4.   


    如你说说那201206cet4应该是可以匹配上的啊。
    ^\\w   -->以2开始,匹配
    \\d{5,} --->01206正好5个数,匹配可结果证明“^\\w+\\d{5,}|\\w”不匹配“201206cet4”。
    或者我的理解是因为\\w+直接就匹配到了字符串的结尾,然后再匹配\\d{5,}时就导致匹配不成功?
      

  5.   


    如你说说那201206cet4应该是可以匹配上的啊。
    ^\\w   -->以2开始,匹配
    \\d{5,} --->01206正好5个数,匹配可结果证明“^\\w+\\d{5,}|\\w”不匹配“201206cet4”。
    或者我的理解是因为\\w+直接就匹配到了字符串的结尾,然后再匹配\\d{5,}时就导致匹配不成功?
    你用的函数是什么?
      

  6.   


    我的代码如下: music_name = “201206cet4”;
     Pattern pattern = Pattern.compile("^\\w+\\d{5,}|\\w");
     Matcher matcher = pattern.matcher(music_name);
     判断matcher.matches()的值为false.
      

  7.   


    我的代码如下: music_name = “201206cet4”;
     Pattern pattern = Pattern.compile("^\\w+\\d{5,}|\\w");
     Matcher matcher = pattern.matcher(music_name);
     判断matcher.matches()的值为false.
    matches()函数是判断字符串整体是否符合正则表达式 
    201206确实能匹配到正则上 但是你的正则结尾是数字 所以后边加上字幕就不匹配了
      

  8.   


    我的代码如下: music_name = “201206cet4”;
     Pattern pattern = Pattern.compile("^\\w+\\d{5,}|\\w");
     Matcher matcher = pattern.matcher(music_name);
     判断matcher.matches()的值为false.
    matches()函数是判断字符串整体是否符合正则表达式 
    201206确实能匹配到正则上 但是你的正则结尾是数字 所以后边加上字幕就不匹配了多谢,你的意思是cet搞的鬼,它们陪不上\d?  现在看起来这个错误太明显。明天再试试,结贴给分。再次谢谢。