Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex用java解析文本文档中的电话号码_Java_Html_Regex - Fatal编程技术网

Regex用java解析文本文档中的电话号码

Regex用java解析文本文档中的电话号码,java,html,regex,Java,Html,Regex,我正在尝试使用正则表达式查找(xxx)xxx xxxx表单中的电话号码,这些电话号码都在一个带有凌乱html的文本文档中 该文本文件包含以下行: <div style="font-weight:bold;"> <div> <strong>Main Phone: <span style="font-weight:normal;">(713) 555-9539&nbsp;&nbsp;&nbsp;&nb

我正在尝试使用正则表达式查找(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
问题是,当我将简单的东西放入模式中进行编译时,它仍然不会返回任何结果。如果它连\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
这让我很困惑,任何帮助都将不胜感激。

请使用
Matcher#find()
而不是
matches()
,后者将尝试将整个线路作为电话号码进行匹配
find()
也将搜索并返回子字符串匹配的
true

Matcher m = p.matcher(line);
此外,上面的行表明您正在循环中再次创建相同的
模式
匹配器
。那是没有效率的。将
模式
移到循环外,并在不同的行上重置和重复使用相同的
匹配器

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);
  }
}

或者可以使用GoogleLibrary-libphonenumber代替regexp,如下所示

    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());
    }
Set phones=new HashSet();
PhoneNumberUtil util=PhoneNumberUtil.getInstance();
迭代器迭代器=util.findNumbers(source,null).Iterator();
while(iterator.hasNext()){
add(iterator.next().rawString());
}

这就是解决方案。感谢您澄清find()和matches()之间的区别。
    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());
    }