正则表达式以字符串开头的字符串

时间:2013-04-20 11:39:41

标签: java regex

我有一些字符串,有这种类型:(notice)Any_other_string(注意:()在此字符串中。

所以,我想把这个字符串分成2部分:(notice)和其他部分。我这样做:

private static final Pattern p1 = Pattern.compile("(^\\(notice\\))([a-z_A-Z1-9])+");
String content = "(notice)Stack Over_Flow 123";

        Matcher m = p1.matcher(content);

        System.out.println("Printing");

        if (m.find()) {
            System.out.println(m.group(0));
            System.out.println(m.group(1));
        }

我希望结果为(notice)Stack Over_Flow 123,但结果是:(notice)Stack(notice)

我无法解释这个结果。哪个正则表达式适合我的目的?

1 个答案:

答案 0 :(得分:2)

问题1:group(0)将始终返回整个匹配 - 这在javadoc中指定 - 并且实际捕获组从索引1开始。只需将其替换为以下内容:

System.out.println(m.group(1));
System.out.println(m.group(2));

问题2:您不会考虑空格和其他字符(例如下划线)(甚至不包括数字0)。我建议使用点.来匹配未知字符。或者在您的正则表达式中包含\\s(空格)和_。以下正则表达式之一应该有效:

(^\\(notice\\))(.+)
(^\\(notice\\))([A-Za-z0-9_\\s]+)

请注意,您需要捕获组内的+,否则它只会找到第二部分的最后一个字符。