我有一些字符串,有这种类型:(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)
我无法解释这个结果。哪个正则表达式适合我的目的?
答案 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]+)
请注意,您需要捕获组内的+,否则它只会找到第二部分的最后一个字符。