3

我正在尝试使用正则表达式来查找 (xxx) xxx-xxxx 形式的电话号码,这些电话号码都在带有凌乱 html 的文本文档中。

文本文件的行如下:

  <div style="font-weight:bold;">
  <div>
   <strong>Main Phone:
   <span style="font-weight:normal;">(713) 555-9539&nbsp;&nbsp;&nbsp;&nbsp;
   <strong>Main Fax:
   <span style="font-weight:normal;">(713) 555-9541&nbsp;&nbsp;&nbsp;&nbsp;
   <strong>Toll Free:
   <span style="font-weight:normal;">(888) 555-9539

我的代码包含:

Pattern p = Pattern.compile("\\(\\d{3}\\)\\s\\d{3}-\\d{4}");
Matcher m = p.matcher(line); //from buffered reader, reading 1 line at a time

if (m.matches()) {
     stringArray.add(line);
}

问题是当我将简单的东西放入模式中进行编译时,它仍然没有返回任何内容。如果它甚至不识别像 \d 这样的东西,我要如何获得电话号码?例如:

Pattern p = Pattern.compile("\\d+"); //Returns nothing
Pattern p = Pattern.compile("\\d");  //Returns nothing
Pattern p = Pattern.compile("\\s+"); //Returns lines
Pattern p = Pattern.compile("\\D");  //Returns lines

这对我来说真的很困惑,任何帮助都将不胜感激。

4

2 回答 2

3

使用Matcher#find()而不是matches()尝试将整行匹配为电话号码。find()也会搜索并返回true子字符串匹配项。

Matcher m = p.matcher(line);

此外,上面的行表明您正在循环中再次Pattern创建相同的内容。Matcher那效率不高。移动Pattern循环外部并重置并Matcher在不同的行上重复使用相同的循环。

Pattern p = Pattern.compile("\\(\\d{3}\\)\\s\\d{3}-\\d{4}");

Matcher m = null;
String line = reader.readLine();
if (line != null && (m = p.matcher(line)).find()) {
    stringArray.add(line);
}

while ((line = reader.readLine()) != null) {
  m.reset(line);
  if (m.find()) {
    stringArray.add(line);
  }
}
于 2013-08-03T20:18:59.643 回答
2

或者代替正则表达式,你可以使用谷歌库 - libphonenumber,如下

    Set<String> phones = new HashSet<>();
    PhoneNumberUtil util = PhoneNumberUtil.getInstance();

    Iterator<PhoneNumberMatch> iterator = util.findNumbers(source, null).iterator();

    while (iterator.hasNext()) {
        phones.add(iterator.next().rawString());
    }
于 2013-09-14T19:38:37.367 回答