使用regex和replaceAll

时间:2014-06-19 19:06:57

标签: java regex

我有regex,用于验证电话号码。

^\\(?(\\d{2,3})\\)?[-(). ]?(\\d{2,3})[-(). ]?(\\d{4})$

(是的,我知道这不完美,但我并不在乎)。我只是用它来用另一个字符串替换电话号码,比如###来删除敏感信息。所以误报很好。

当我搜索的字符串只是一个电话号码时,它可以正常工作。这有效:

String PHONE_PATTERN = "^\\(?(\\d{2,3})\\)?[-(). ]?(\\d{2,3})[-(). ]?(\\d{4})$";
String phone = "123-123-1234";
System.out.println(s.replaceAll(PHONE_PATTERN, "###")); //prints '###'

但是对于周围的文字,它不起作用:

String PHONE_PATTERN = "^\\(?(\\d{2,3})\\)?[-(). ]?(\\d{2,3})[-(). ]?(\\d{4})$";
String phone = "some other text 123-123-1234";
System.out.println(s.replaceAll(PHONE_PATTERN, "###"));

由于不起作用,我的意思是文本打印不变。

我需要更改我的正则表达式才能使其工作,以便第二个示例打印

some other text ###

3 个答案:

答案 0 :(得分:6)

从表达式的开头和结尾删除^$。这些字符与String的开头和结尾匹配,但您不希望电话号码是String的唯一内容,因此您应该删除它们。

答案 1 :(得分:5)

而不是主播^$使用\b(字边界):

String PHONE_PATTERN = "\\b\\(?(\\d{2,3})\\)?[-(). ]?(\\d{2,3})[-(). ]?(\\d{4})\\b";

答案 2 :(得分:4)

您需要删除字符串 ^字符串 $锚点的开头,同时将这两者设置为你匹配字符串中第一个字符的整个字符串,直到字符串中的最后一个字符。

  • ^规定模式必须与子字符串开始与字符串中第一个字符匹配。
  • $规定模式必须与子字符串结尾与字符串中的 last 字符匹配。

如果您想搜索一端或另一端的模式,时需要使用锚点。