java Matcher删除一些字符

java Matcher删除一些字符,java,regex,Java,Regex,我有一个字符串“Mo Sa 10:00-20:00”。我想要两组。第一组为Mo Sa,第二组为10:00-20:00。第一组只能包含一天,例如“Mo”。所以我想我需要以下正则表达式:([MTWFSouehrao-]{2,5})([0-9:-]{11})。 我的Java代码是: Matcher match = Pattern.compile("([MTWFSouehrao-]{2,5}) ([0-9:-]{11})").matcher("Mo-Sa 10:00-20:00"); if (match

我有一个字符串“Mo Sa 10:00-20:00”。我想要两组。第一组为Mo Sa,第二组为10:00-20:00。第一组只能包含一天,例如“Mo”。所以我想我需要以下正则表达式:
([MTWFSouehrao-]{2,5})([0-9:-]{11})
。 我的Java代码是:

Matcher match = Pattern.compile("([MTWFSouehrao-]{2,5}) ([0-9:-]{11})").matcher("Mo-Sa 10:00-20:00");
if (match.matches() && match.find(1) && match.find(2)) {
     String s = match.group(0); // -Sa 10:00-20:00
     String s1 = match.group(1); // -Sa
     String s2 = match.group(2); // 10:00-20:00
}
为什么第一组是“-Sa”而不是“mosa”?这是没有意义的…

在您的情况下,您正在调用
find(inti)

这可能不是您所期望的:它不会测试是否找到索引
i
处的组,而是在重置匹配器后在索引
i
处移动光标

所有条件都是
true
,由于您使用的是
&&
,因此所有条件都会被评估

因此,
match.find(2)
是最后一次求值,因此分组从输入的索引
2
开始

如果您只是删除这些条件,您的输出将是您所期望的:

if (match.matches()) {
...
输出

Mo-Sa 10:00-20:00
Mo-Sa
10:00-20:00
注意

为了测试组索引是否匹配,可以使用:

  • Matcher#groupCount()
    避免对不存在的组索引执行
    IndexOutOfBoundsException
    s
  • Matcher.group(int i)
    并与
    null
    进行比较,以确定特定组是否满足其条件。这将要求首先调用
    find
    matches
  • 文件

是的,你是对的。find方法更改光标位置。