0

我想移植一个通用的文本处理工具,Texy!,从 PHP 到 Java。

该工具使用preg_match_all("/.../U"). 所以我正在寻找一个有一些UNGREEDY标志的图书馆。

知道我可以使用该.*?语法,但确实有很多正则表达式我必须覆盖,并在每个更新版本中检查它们。

我已经检查过了

  • ORO - 似乎被遗弃了
  • 雅加达正则表达式 - 不支持
  • java.util.regex - 不支持

有没有这样的图书馆?

谢谢, 翁德拉

4

4 回答 4

4

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

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

原来的弃用回应 老实说,我不认为有一个。

+的整个点?和 *?是这样你可以选择哪些部分贪婪地做,哪些部分懒惰地做。

贪婪是默认行为,因为这是正则表达式中 + 和 * 最常用的用法。事实上,我想不出一个正则表达式解析器可以反过来做。就像使用修饰符使某些东西变得贪婪一样,默认值是惰性匹配。

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

于 2009-10-12T02:08:03.657 回答
1

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

于 2009-10-12T02:17:32.997 回答
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,这可能是最好的方法。

于 2009-10-12T02:52:45.520 回答
1

您也许可以使用“com.caucho.quercus.lib.regexp.JavaRegexpModule”。 Quercus 是 PHP 的 Java 实现,而正则表达式库实现了 PHP 正则表达式语法和方法名称

于 2009-10-12T02:58:12.593 回答