模式在组中只找到正则表达式的一个字符

时间:2015-11-02 06:25:30

标签: java regex

我的模式编译如下:

Pattern pattern = Pattern.compile(".*((M+)\\W*(d+)).*");

字符串:

String string = "EEEE, MMMM d, yyyy";

matcher.group(2)只返回“M”,但我想获得整个“MMMM”字样。我怎样才能使用群组?我以为M +正则表达式会处理这个案子。在此先感谢;)

2 个答案:

答案 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   添加到正则表达式的味道,但你必须小心使用它们。一个   非贪婪.*?几乎绝不是[^...]*的合理替代品    - 一个人可能适合某一特定情况,但由于他们的原因   意义截然不同,另一种可能不正确。