我有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 ###
答案 0 :(得分:6)
从表达式的开头和结尾删除^
和$
。这些字符与String的开头和结尾匹配,但您不希望电话号码是String的唯一内容,因此您应该删除它们。
答案 1 :(得分:5)
而不是主播^
和$
使用\b
(字边界):
String PHONE_PATTERN = "\\b\\(?(\\d{2,3})\\)?[-(). ]?(\\d{2,3})[-(). ]?(\\d{4})\\b";
答案 2 :(得分:4)
您需要删除字符串 ^
和字符串 $
锚点的开头,同时将这两者设置为你匹配字符串中第一个字符的整个字符串,直到字符串中的最后一个字符。
^
规定模式必须与子字符串开始与字符串中第一个字符匹配。$
规定模式必须与子字符串结尾与字符串中的 last 字符匹配。如果您想搜索一端或另一端的模式,即时需要使用锚点。