我的模式编译如下:
Pattern pattern = Pattern.compile(".*((M+)\\W*(d+)).*");
字符串:
String string = "EEEE, MMMM d, yyyy";
matcher.group(2)只返回“M”,但我想获得整个“MMMM”字样。我怎样才能使用群组?我以为M +正则表达式会处理这个案子。在此先感谢;)
答案 0 :(得分:1)
您需要在.*
旁边添加?
,将第一个*
视为非贪婪。注意.*
是贪婪的,它与所有角色相匹配。因此,.*(M+)
应仅捕获最后一个M
,因为M
之前存在的所有字符都与.*
匹配。
Pattern pattern = Pattern.compile(".*?((M+)\\W*(d+)).*");
答案 1 :(得分:1)
另一种方法是在你的正则表达式中尽可能具体。如果你不想吃饭"在开头M
,您应该指定:
Pattern pattern = Pattern.compile("[^M]*((M+)\\W*(d+)).*");
编辑:根据Jeffrey E.F. Friedl in his book "Mastering Regular Expressions"(第7章,第34节;非贪婪构造与否定字符类")在大多数情况下,否定字符类应优先于非贪婪的运算符的情况。这是本书(较旧的)打印版本第227页上一节中最后一段的引用。
非贪婪的构造毫无疑问是最强大的Perl5 添加到正则表达式的味道,但你必须小心使用它们。一个 非贪婪
.*?
几乎绝不是[^...]*
的合理替代品 - 一个人可能适合某一特定情况,但由于他们的原因 意义截然不同,另一种可能不正确。