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

时间:2014-08-12 12:48:56

标签: java regex

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

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

我得到的那一刻:

static String pattern = "\\d{3}[-.]\\d{3}[-.]\\d{4}";

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

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

 Pattern p = Pattern.compile(pattern);

然后在Matcher中使用:

Matcher m = p.matcher(phoneNumber);
if(m.find()){
    //do stuff
}

1 个答案:

答案 0 :(得分:7)

您可以尝试使用与之前与捕获组匹配的相同文本匹配的back reference

您需要使用-在捕获组中添加.(...),可以使用\index_of_group

在下次匹配中引用
              \d{3}([-.])\d{3}\1\d{4}
Captured Group 1----^^^^      ^^-------- Back Reference first matched group

这是online demo

示例代码:

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

模式说明:

  \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)