我厌倦了写作
Pattern p = Pattern.compile(...
Matcher m = p.matcher(str);
if (m.find()) {
...
我的代码中一遍又一遍。我打算写一个帮助器类来使它更整洁,但我想知道:是否有一个库试图为Java中的正则表达式提供更简单的外观?
我正在考虑commons-lang和Guava的风格。
澄清:我实际上希望有一些通用库能够使正则表达式更加简化,就像perl一样。上面的代码只是一个例子。
我在考虑一些我可以这样使用的东西:
for (int question : RegEx.findAllInts("SO question #(\\d+)", str)) {
// do something with int
}
同样,这只是我想要的众多事情中的一个例子。可能甚至不是一个好例子。 API很难。
更新:我猜答案是“不”。感谢所有的答案,请进行投票。
答案 0 :(得分:2)
为什么不编写自己的包装方法?当然,你不应该重新发明轮子,但另一个库也意味着另一个依赖。
答案 1 :(得分:2)
Pattern
只应编译一次;将其保存在静态最终字段中。这至少可以避免在编码时重复执行此步骤。也就是说,出于性能原因,这一步并不总是与创建Matcher
同时进行。
在您的示例中,似乎RegEx
无论如何都扮演Matcher
对象的角色。我希望它不应该是一个静态方法的类,因为这在多线程环境中不起作用 - find
和getInt
调用没有连接。所以你无论如何都需要某种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,但在特定情况下,它可能会做你想要的。