正则表达式不工作(Java)

正则表达式不工作(Java),java,regex,Java,Regex,我想生成一个正则表达式,它与形式(+92)-(21)-1234…匹配。我做了这个节目 public static void main(String[] args) { // A regex and a string in which to search are specifi ed String regEx = "([+]\\d{2})-(\\d{2})-\\d+"; String phoneNumber = "(+92)-(21)-1234567890";

我想生成一个正则表达式,它与形式(+92)-(21)-1234…匹配。我做了这个节目

public static void main(String[] args) {

    // A regex and a string in which to search are specifi ed
    String regEx = "([+]\\d{2})-(\\d{2})-\\d+";
    String phoneNumber = "(+92)-(21)-1234567890";

    // Obtain the required matcher
    Pattern pattern = Pattern.compile(regEx);
    Matcher matcher = pattern.matcher(phoneNumber);

    if (matcher.matches()) {
        System.out.println("Phone Number Valid");
    } else {
        System.out.println("Phone Number must be in the form (+xx)-(xx)-xxxxx..");
    }

} //end of main()
我创建的正则表达式以括号()、+[+]、两个数字(\d{2})、括号闭合()、破折号(-)、起始括号()、两个数字(\d{2})、括号闭合()、破折号(-)然后是任意位数(\d+)。但它不起作用。我做错了什么

谢谢

我创建的正则表达式以括号()

不,它以分组构造开始-这就是正则表达式中的unscaped
的意思。我没有详细研究表达式的其余部分,但请尝试转义括号:

String regEx = "\\([+]\\d{2}\\)-\\(\\d{2}\\)-\\d+";
或者用一种更好的方式来表达你需要+

String regEx = "\\(\\+\\d{2}\\)-\\(\\d{2}\\)-\\d+";

跳出括号和破折号

你需要跳出偏执(正如Jon已经提到的,他们创建了一个捕获组):

输出:

电话号码有效

正确的正则表达式是

[(][+]\\d{2}[)]-[(]\\d{2}[)]-\\d+

你只需要把括号放在[和]之间。

如果加号总是在那里,你可以只写
\+
,如果它可能在那里,也可能不在那里,
\+?
。你应该像这样转义所有特定于正则表达式的字符

String regEx = "\\(\\+\\d{2}\\)-\\(\\d{2}\\)-\\d+";

您应该转义(和)括号,它们用于在正则表达式中分组,还必须转义+号。@pushy:我相信使用
[+]
没问题,但是
\\+
会更清晰。这是我喜欢的Java正则表达式的有趣部分——反斜杠总是比有效字符多得多。嗯,这意味着如果我只想使用+而不是[+],那么我应该使用\\before+like\+。正则表达式中使用的任何字符都必须以\\,like\(用于左括号和\)开头表示结束括号,\\+表示加号。另一种方法是按照Amit Bhargava和其他人的建议,使用[(]和[)]表示开括号和结束括号。我说的对吗?@Basit:这不是任何字符……这是任何在正则表达式中具有特殊含义的字符。我通常不会像通常用于“匹配此集合中的任何字符”。HHmm好的,现在我知道了。您的意思是说我们在正则表达式中使用+来附加任意数量的字符,所以我必须在它(\\+)之前使用\\,对于(和)也一样因为它们是用来在正则表达式中分组的。但是“a”或任何字母在正则表达式中没有特殊意义,所以我只能使用a,这次没有必要\\a。我现在是吗?@Basit:没错。事实上,对于某些字母,你会发现它的含义完全不同,例如
\d
意思是“数字”。(顺便说一句,您必须了解Java文本中的
\`在正则表达式本身中的意思是
`,这一点很重要。)
String regEx = "\\(\\+\\d{2}\\)-\\(\\d{2}\\)-\\d+";