我们应该在Java中使用正则表达式吗?

时间:2011-03-17 14:08:20

标签: java regex

我知道正则表达式非常强大,要成为专家并不容易。

我的一位同事曾写过一个java类来解析格式化的文本文件。不幸的是,它在第​​一次集成测试中导致了StackOverFlowError。在结构编程世界的另一位同事过来并通过抛弃所有正则表达式而不是使用许多嵌套条件语句和许多拆分和修剪方法来快速修复它之前,找到这个bug似乎很困难,而且效果非常好!

那么,为什么我们需要像Java这样的编程语言中使用正则表达式?据我所知,正则表达式唯一必要的用法是文本编辑器中的查找/替换功能。

9 个答案:

答案 0 :(得分:4)

与其他所有内容一样:谨慎使用, KISS

我经常使用正则表达式,但我不会超过顶部写一个100个字符的正则表达式,因为我知道我(个人)以后不会理解它...事实上我认为我的限制是关于30-40个字符,大于这个数字会让我花太多时间挠头。

答案 1 :(得分:4)

根据定义,任何可以表达为正则表达式的东西都可以表示为IF链。您使用REGEX基本上有两个原因:

  • 对于某些表达式,REGEX库往往具有优化的实现,大部分时间都比手动编码的“IF”链更好。
  • 如果编写得当,REGEX通常比IF链更容易理解。特别适用于更复杂的表达。

如果您的表达过于复杂,请使用this answer提供的建议。如果它变得非常讨厌,请考虑学习如何使用像ANTLR或JavaCC这样的解析器生成器。简单的语法通常可以取代正则表达式,并且维护起来要容易得多。

答案 2 :(得分:3)

如果您发现正则表达式过于复杂且不可维护,请改用代码。即使对于听起来非常简单的事情,正则表达式也会变得非常复杂。例如,以mm / dd / yy [yy]格式验证日期与“简单”一样:

^(((((((0?[13578])|(1[02]))[\.\-/]?((0?[1-9])|([12]\d)|(3[01])))|(((0?[469])|(11))[\.\-/]?((0?[1-9])|([12]\d)|(30)))|((0?2)[\.\-/]?((0?[1-9])|(1\d)|(2[0-8]))))[\.\-/]?(((19)|(20))?([\d][\d]))))|((0?2)[\.\-/]?(29)[\.\-/]?(((19)|(20))?(([02468][048])|([13579][26])))))$

没人能保持这一点。手动解析日期将需要更多代码,但可以更具可读性和可维护性。

正则表达式非常强大,可用于匹配 TEXT 模式,但不适合使用日期等数字部分进行验证。

答案 3 :(得分:2)

因此,使用许多split和trim方法的多个嵌套条件语句比使用正则表达式的一行或两行更容易调试?

我的偏好是正则表达式,因为一旦你学习它们,它们比解析巨大的嵌套if循环更易于维护和阅读。

答案 4 :(得分:1)

与往常一样,您应该使用最好的工具来完成工作。我将通过最简单,可理解,有效的方法来定义“最佳工具”,以满足要求。

正则表达式通常会简化代码并使其更具可读性。但情况并非总是如此。

另外,我不会得出正则表达式引起StackOverflowError的结论。

答案 5 :(得分:1)

正则表达式是一种工具(与许多其他工具一样)。当使用该工具完成最佳工作时,您应该使用它。要知道要使用哪种工具,它会帮助提出一个问题,例如“我何时可以使用正则表达式?”。当然,当您在工具箱中使用许多不同的工具并且相当了解它们时,将更容易确定使用哪种工具。

答案 6 :(得分:1)

你可以巧妙地使用正则表达式,将它们分成更小的块,比如

final String REGEX_SOMETHING = "something";
final String REGEX_WHATEVER = "whatever";
..
String REGEX_COMPLETE = REGEX_SOMETHING + REGEX_WHATEVER + ...

答案 7 :(得分:1)

正则表达式可以更容易阅读,但它们也可能过于复杂。这取决于您要匹配的数据格式。

Java RE实现仍然有一些怪癖,其结果是一些非常简单的表达式(如'((?:[^'\\]|\\.)*)')在匹配更长的字符串时会导致堆栈溢出。因此,请确保使用实际数据(以及更极端的示例)进行测试 - 或者使用具有不同实现的正则表达式引擎(有几个,也作为Java库)。

答案 8 :(得分:0)

正则表达式在查找内容中的模式方面非常强大。您当然可以避免使用正则表达式并依赖条件语句,但您很快就会注意到需要多行代码才能完成相同的任务。使用太多嵌套的条件语句会增加代码的圈复杂度,因此,测试变得更加困难,因为要测试的分支太多。此外,它还使代码难以阅读和理解。

当然,你的同事应该先写一些测试用例来测试他的正则表达式。

这里没有正确或错误的答案。如果任务很简单,那么就不需要使用正则表达式。否则,最好在这里和那里撒一些正则表达式,以使您的代码易于阅读。