我正在尝试使用正则表达式来查找格式为(xxx)xxx-xxxx的电话号码,这些电话号码都位于带有凌乱html的文本文档中。
文本文件包含以下行:
<div style="font-weight:bold;">
<div>
<strong>Main Phone:
<span style="font-weight:normal;">(713) 555-9539
<strong>Main Fax:
<span style="font-weight:normal;">(713) 555-9541
<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
这对我来说真的很困惑,任何帮助都会受到赞赏。
答案 0 :(得分: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);
}
}
答案 1 :(得分:2)
或者代替regexp,您可以使用Google库 - 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());
}