日期:2014-05-20  浏览次数:20805 次

用java正则表达式从字符串中提取号码,有点问题,请教。。。
假如有以下的字符串:
骗子的电话是13944447777和076812345678,银行帐号:62240755123456780 身份证:4744134123456789

我使用正则表达式提前号码时,把银行帐号、身份证中符合号码(红色)一起提取出来了。。。
我的正则表达式:
Java code
//判断电话号码必须是0开头,第二位不能为0,加上1位或2为数字作为区号,加上-可有可无,最后为7或8位号码
//手机号码是13或15开头
Pattern pattern = Pattern.compile("0[^0]\\d{1,2}[-]?\\d{7,8}|13\\d{9}|15\\d{9}");

Matcher matcher = pattern.matcher(text);
String tmp = "";
while (matcher.find()) {
  tmp += matcher.group() + ",";
}

//这样肯定是把匹配号码都提取出来了。

//改正一下正则表达式,匹配的号码前后加上了\D (非数字):
\D0[^0]\d{1,2}[-]?\d{7,8}\D|\D13\d{9}\D|\D15\d{9}\D
//最后我还做了些处理,省略。。。


大家帮忙提供下正则表达式,或其它处理的方法。。。






------解决方案--------------------
Java code

package test;

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

/**
 * 提取指定字串中的电话和手机号码
 * @author yeyong
 */
public class PickUpPhone {
  private final static Pattern pattern = Pattern.compile("(?<!\\d)(?:(?:1[35]\\d{9})|(?:0[1-9]\\d{1,2}-?\\d{7,8}))(?!\\d)");
  /**
   * 提取text中的电话和手机号码
   * @param text
   * @return
   */
  public static String pickUp(String text) {
    Matcher matcher = pattern.matcher(text);
    StringBuffer bf = new StringBuffer(64);
    while (matcher.find()) {
      bf.append(matcher.group()).append(",");
    }
    int len = bf.length();
    if (len > 0) {
      bf.deleteCharAt(len - 1);
    }
    return bf.toString();
  }

  public static void main(String[] args) {
    String text = "骗子的电话是13944447777和076812345678,银行帐号:2240755123456780 身份证:4744134123456789,  错误的号码139444477771(多了一位)";
    String phones = PickUpPhone.pickUp(text);
    System.out.println(phones);
    // 输出:
    // 13944447777,076812345678
  }
}