我想移植一个通用的文本处理工具,Texy!,从 PHP 到 Java。
该工具使用preg_match_all("/.../U")
. 所以我正在寻找一个有一些UNGREEDY
标志的图书馆。
我知道我可以使用该.*?
语法,但确实有很多正则表达式我必须覆盖,并在每个更新版本中检查它们。
我已经检查过了
- ORO - 似乎被遗弃了
- 雅加达正则表达式 - 不支持
- java.util.regex - 不支持
有没有这样的图书馆?
谢谢, 翁德拉
我想移植一个通用的文本处理工具,Texy!,从 PHP 到 Java。
该工具使用preg_match_all("/.../U")
. 所以我正在寻找一个有一些UNGREEDY
标志的图书馆。
我知道我可以使用该.*?
语法,但确实有很多正则表达式我必须覆盖,并在每个更新版本中检查它们。
我已经检查过了
有没有这样的图书馆?
谢谢, 翁德拉
更新:检查文档后,我发现了 LAZY 标志,这是非贪婪的另一个术语。但是它似乎只在 OpenJDK 中可用
p = Pattern.compile("your regex here", LAZY);
p.matcher("string to match")
原来的弃用回应 老实说,我不认为有一个。
+的整个点?和 *?是这样你可以选择哪些部分贪婪地做,哪些部分懒惰地做。
贪婪是默认行为,因为这是正则表达式中 + 和 * 最常用的用法。事实上,我想不出一个正则表达式解析器可以反过来做。就像使用修饰符使某些东西变得贪婪一样,默认值是惰性匹配。
我知道这不是您要寻找的答案,但是,我认为您能够使其工作的唯一方法是添加 ? 到您的 * 和 + 。从好的方面来说,您可以使用正则表达式来帮助确定哪些需要更改。如果所有这些都需要更改,甚至可以为您进行更改。或者,如果您可以描述一种模式来识别需要更改的内容。
关于检查和重新检查所有正则表达式的想法,您确定 php 和 java 库在语法上足够一致,您无论如何都不必这样做?我首先要做的是遍历它们并编写一些测试(输入和输出)并确保它们在两种实现中的工作方式相同。然后设计一种自动运行它们的方法,您将在未来的升级和不兼容问题上得到保障。你仍然需要调整一些东西,但至少你会知道在哪里。
我建议您创建自己的修改后的 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,这可能是最好的方法。
您也许可以使用“com.caucho.quercus.lib.regexp.JavaRegexpModule”。 Quercus 是 PHP 的 Java 实现,而正则表达式库实现了 PHP 正则表达式语法和方法名称。