0

我有一些字符串,它有这种类型:((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)and Stack Over_Flow 123,但结果是 : (notice)Stackand(notice)

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

4

1 回答 1

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]+)

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

于 2013-04-20T11:41:41.983 回答