何时值得在Java中使用RegEx?

Rus*_*ell 4 java regex

我正在写一个小应用程序,它读取一些输入并根据该输入做一些事情.

目前我正在寻找以"魔术"结尾的行,我会使用String的endsWith方法.对于那些正在阅读我的代码的人来说,这是很清楚的.

另一种方法是创建一个Pattern并尝试匹配以"magic"结尾的行.这也很清楚,但我个人认为这是一种矫枉过正,因为我正在寻找的模式并不复杂.

你认为什么时候使用RegEx Java值得?如果它的复杂性,你会如何个人定义什么是复杂的?

此外,是否有时候使用模式实际上比字符串操作更快?

编辑:我正在使用Java 6.

Sea*_*oyd 10

基本上:如果有一个非正则表达式操作可以一步完成你想要的操作,那么总是这样做.

这不是关于性能,而是关于a)可读性和b)编译时安全性.专用的非正则表达式版本通常比正则表达式版本更容易阅读.并且其中一个专门方法中的拼写错误将无法编译,而正则表达式中的拼写错误将在运行时失败.

将基于Regex的解决方案与非Regex-base解决方案进行比较

String s = "Magic_Carpet_Ride";

s.startsWith("Magic");   // non-regex
s.matches("Magic.*");    // regex

s.contains("Carpet");    // non-regex
s.matches(".*Carpet.*"); // regex

s.endsWith("Ride");      // non-regex
s.matches(".*Ride");     // regex
Run Code Online (Sandbox Code Playgroud)

在所有这些情况下,这是一个明智的选择:使用非正则表达式版本.

但是当事情变得更复杂时,它取决于.我猜我在以下情况下仍会坚持使用非正则表达式,但很多人不会:

// Test whether a string ends with "magic" in any case,
// followed by optional white space
s.toLowerCase().trim().endsWith("magic"); // non-regex, 3 calls
s.matches(".*(?i:magic)\\s*");            // regex, 1 call, but ugly
Run Code Online (Sandbox Code Playgroud)

并回应RegexesCanCertainlyBeEasierToReadThanMultipleFunctionCallsToDoTheSameThing:

我仍然认为非正则表达式版本更具可读性,但我会这样写:

s.toLowerCase()
 .trim()
 .endsWith("magic");
Run Code Online (Sandbox Code Playgroud)

完全不同,不是吗?

  • 换句话说,"当你需要使用正则表达式时,你应该只使用正则表达式". (3认同)