使用regex和replaceAll

jla*_*s62 2 java regex

我有这个regex用于验证电话号码.

^\\(?(\\d{2,3})\\)?[-(). ]?(\\d{2,3})[-(). ]?(\\d{4})$
Run Code Online (Sandbox Code Playgroud)

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

它在我搜索的字符串只是一个电话号码时有效.这有效:

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

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

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, "###"));
Run Code Online (Sandbox Code Playgroud)

通过不起作用,我的意思是文本打印不变.

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

some other text ###
Run Code Online (Sandbox Code Playgroud)

小智 6

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


anu*_*ava 5

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

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