我想将通用文本处理工具Texy!从PHP移植到Java。
此工具使用preg_match_all("/.../U")
无处不匹配。
所以我正在寻找一个有UNGREEDY
标志的库。
我知道我可以使用.*?
语法,但是我必须覆盖很多正则表达式,并检查每个更新版本。
我已经检查了
有没有这样的图书馆?
谢谢,Ondra
答案 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。