Java Regex:UNGREEDY标志

时间:2009-10-12 00:28:47

标签: java php regex reluctant-quantifiers non-greedy

我想将通用文本处理工具Texy!从PHP移植到Java。

此工具使用preg_match_all("/.../U")无处不匹配。 所以我正在寻找一个有UNGREEDY标志的库。

知道我可以使用.*?语法,但是我必须覆盖很多正则表达式,并检查每个更新版本。

我已经检查了

  • ORO - 似乎被抛弃了
  • Jakarta Regexp - 不支持
  • java.util.regex - 不支持

有没有这样的图书馆?

谢谢,Ondra

4 个答案:

答案 0 :(得分:3)

更新:检查文档后,我找到了LAZY标志,这是非贪婪的另一个术语。但是它似乎只能在OpenJDK中使用

p = Pattern.compile("your regex here", LAZY);
p.matcher("string to match")

原始弃用的回复 老实说,我认为没有。

+的全部意义?和*?是这样你可以选择贪婪地做哪些部分以及懒散地做哪些部分。

贪婪是默认行为,因为这是正则表达式中最常用的+和*。事实上,我无法想到一个单一的正则表达式解析器,反之亦然。就像使用修饰符来制作贪婪的东西一样,默认是懒惰匹配。

我知道这不是您正在寻找的答案,但是,我认为您能够使其发挥作用的唯一方法是添加?你的*和+'。在好的方面,您可以使用正则表达式来帮助确定哪些需要更改。如果需要更改所有更改,甚至可以为您进行更改。或者,如果您能够描述一个标识哪个需要更改的模式。

答案 1 :(得分:1)

关于检查和重新检查所有正则表达式的想法,你确定php和java库在语法方面是否足够,你无论如何都不必这样做?我之前要做的就是仔细检查它们并编写一些测试(输入和输出)并确保它们在两种实现中的工作方式相同。然后设计一种自动运行它们的方法,您将获得覆盖,以便将来升级和不兼容。你仍然需要调整一些东西,但至少你会知道在哪里。

答案 2 :(得分:1)

我建议你创建自己的修改过的Java库。只需将java.util.regex源复制到您自己的包中即可。

Sun JDK 1.6 Pattern.java类提供了这些默认标志:

static final int GREEDY     = 0;

static final int LAZY       = 1;

static final int POSSESSIVE = 2;

您会注意到这些标志只使用了几次,修改起来很简单。请看以下示例:

    case '*':
        ch = next();
        if (ch == '?') {
            next();
            return new Curly(prev, 0, MAX_REPS, LAZY);
        } else if (ch == '+') {
            next();
            return new Curly(prev, 0, MAX_REPS, POSSESSIVE);
        }
        return new Curly(prev, 0, MAX_REPS, GREEDY);

只需更改最后一行即可使用'LAZY'标志而不是GREEDY标志。由于您希望正则表达式库的行为类似于PHP,这可能是最好的方法。

答案 3 :(得分:1)

您可以使用'com.caucho.quercus.lib.regexp.JavaRegexpModule'。 Quercus is a Java implementation of PHP,正则表达式库实现PHP正则表达式syntax and method names