2012-02-21 91 views
1

不应该将SPAN标记放在电话号码之外,不要放在里面吗?Java正则表达式:替换电话号码(包括可选的括号)

String aParagraph = "start 201-555-1212 more (301)-777-1212 again (401) 888-1212 end"; 
String phoneRegEx = "\\b(\\(?[1-9]{1}[0-9]{2}\\)?[- ]?[1-9]{1}[0-9]{2}-[0-9]{4})\\b"; 
String replaceWith = "<span>$1</span>"; 

aParagraph = aParagraph.replaceAll(phoneRegEx , replaceWith); 
+0

第一组是外部的一个,对吗? – Alfabravo 2012-02-21 01:27:09

回答

1

字边界\b匹配\w+的边界。你可以删除它们:

String aParagraph = "start 201-555-1212 more (301)-777-1212 again (401) 888-1212 end"; 
String phoneRegEx = "(\\(?[1-9]{1}[0-9]{2}\\)?[- ]?[1-9]{1}[0-9]{2}-[0-9]{4})"; 
String replaceWith = "<span>$1</span>"; 

aParagraph = aParagraph.replaceAll(phoneRegEx, replaceWith); 
+0

它工作正常,没有\ b。但我认为我* HAD TO *有2 \ b标记,以确保它避免匹配“this201-555-1212那”。没有?当* DO *时,我需要2 \ b标记? – Carol 2012-02-21 02:00:44

+0

@Carol:想一想,我从来没有必要在正则表达式中使用'\ b'。但在这种情况下,你是安全的; '[1-9]'与's'不匹配(在'this'的末尾)。 – Ryan 2012-02-21 02:11:05

0

问题是使用\b。它认为第一个数字是字边界的开始,而不是(。因此,它实际上是匹配:

301)-777-1212 

而且不

(301)-777-1212 

,你打算。