通缉:一个非常简单的Java RegEx API

时间:2010-05-10 09:38:49

标签: java regex

我厌倦了写作

Pattern p = Pattern.compile(...
Matcher m = p.matcher(str);
if (m.find()) {
   ...

我的代码中一遍又一遍。我打算写一个帮助器类来使它更整洁,但我想知道:是否有一个库试图为Java中的正则表达式提供更简单的外观?

我正在考虑commons-langGuava的风格。

澄清:我实际上希望有一些通用库能够使正则表达式更加简化,就像perl一样。上面的代码只是一个例子。

我在考虑一些我可以这样使用的东西:

for (int question : RegEx.findAllInts("SO question #(\\d+)", str)) {
   // do something with int
}

同样,这只是我想要的众多事情中的一个例子。可能甚至不是一个好例子。 API很难。

更新:我猜答案是“不”。感谢所有的答案,请进行投票。

7 个答案:

答案 0 :(得分:2)

为什么不编写自己的包装方法?当然,你不应该重新发明轮子,但另一个库也意味着另一个依赖。

答案 1 :(得分:2)

Pattern只应编译一次;将其保存在静态最终字段中。这至少可以避免在编码时重复执行此步骤。也就是说,出于性能原因,这一步并不总是与创建Matcher同时进行。

在您的示例中,似乎RegEx无论如何都扮演Matcher对象的角色。我希望它不应该是一个静态方法的类,因为这在多线程环境中不起作用 - findgetInt调用没有连接。所以你无论如何都需要某种Matcher

因此,当您考虑设计因素时,您会回到Java API。不,我认为没有更短的方法来正确有效地

答案 2 :(得分:2)

有一个java库,它具有内置java regex库的扩展功能。看看RegExPlus。我没有亲自试过。但希望这有帮助。

答案 3 :(得分:2)

是的,它总是让我烦恼,不得不写出如此多的样板来执行这样的常见任务。我认为如果String有一对像

这样的方法会有很多帮助
public String findFirst(String regex)

public String[] findAll(String regex)

这些代表了String方法尚不支持的两种最常执行的正则表达式操作。如果我们有这些,加上像Rewriter这样的动态替换工具,我们几乎可以忘记Pattern和Matcher。当我们写一些非常复杂的东西时,我们只需要它们,比如findAllInts()方法。 :d

答案 4 :(得分:1)

从Java 1.4开始,您也可以使用String.matches(String regex)。这恰好是上述代码的外观。

答案 5 :(得分:1)

Jakarta Regexp(请参阅RE类)。查看this old thread以了解Jakarta RegExp包相对于Java内置RegEx的优势。

答案 6 :(得分:1)

对于您提供的具体示例,可能能够使用Guava的分割器即兴创作:

for (String number : Splitter.onPattern("[^\d]+").split(input)) {
    // Do something with the number
}

或更具体地说,如果您输入了

SO question #1234, SO Question #3456, SO Question #5678
你可以做

for (String number : Splitter.onPattern("(, )? SO Question #").split(input)) {
    // Do something
}

有点hacky,但在特定情况下,它可能会做你想要的。