正则表达式:只有在字符串中找到另一个字符时才允许字符

jba*_*991 4 java regex

如果已找到其他字符,是否可以排除使用某些字符?

例如,在电话号码字段123-456-7890和123.456.7890有效,但123-456.7890不是.

在我有的时候:

static String pattern = "\\d{3}[-.]\\d{3}[-.]\\d{4}";
Run Code Online (Sandbox Code Playgroud)

如何改进以满足上述要求?

为了澄清,它将用在一个字符串中,该字符串将被编译为Pattern对象:

 Pattern p = Pattern.compile(pattern);
Run Code Online (Sandbox Code Playgroud)

然后在Matcher中使用:

Matcher m = p.matcher(phoneNumber);
if(m.find()){
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*raj 7

您可以尝试使用与之前与捕获组匹配的相同文本匹配的后向引用.

您需要添加-.使用(...)可在下次匹配中使用的捕获组\index_of_group

              \d{3}([-.])\d{3}\1\d{4}
Captured Group 1----^^^^      ^^-------- Back Reference first matched group
Run Code Online (Sandbox Code Playgroud)

这是在线演示

示例代码:

System.out.print("123-456-7890".matches("^\\d{3}([-.])\\d{3}\\1\\d{4}$"));//true
System.out.print("123.456.7890".matches("^\\d{3}([-.])\\d{3}\\1\\d{4}$"));//true
System.out.print("123-456.7890".matches("^\\d{3}([-.])\\d{3}\\1\\d{4}$"));//false
Run Code Online (Sandbox Code Playgroud)

模式说明:

  \d{3}                    digits (0-9) (3 times)
  (                        group and capture to \1:
    [-.]                     any character of: '-', '.'
  )                        end of \1
  \d{3}                    digits (0-9) (3 times)
  \1                       what was matched by capture \1
  \d{4}                    digits (0-9) (4 times)
Run Code Online (Sandbox Code Playgroud)