使用 RegEx 进行简单操作

Using RegEx for simple operations

我想知道是否有某种原因有人想要使用正则表达式来解决一个问题,这个问题也可以很容易地写成 而不 使用正则表达式。

我之所以有这个想法是因为

问题相当简单,答案分为两类,一类是用正则表达式解决的,另一类是只使用其他一些简单操作的。

问题总结:
删除url路径的第一部分(例如:String path = "/folder1/folder2/folder3/")。

2 个解决方案:

//With regex
String newPathRegex = path.replaceAll("^/[^/]*", "");
//Without regex
String newPathNoRegex = path.substring(path.indexOf('/', 1));

我个人认为 no RegEx 解决方案更容易阅读,但我不是正则表达式方面的专家。

所以问题归结为:在这种情况下是否应该避免使用正则表达式? RegEx 解决方案是否有更好的性能?

使用正则表达式有用的几个原因:

  • 正则表达式运行在O(n log n)中表达式的大小和O(n) 字符串的长度。所以时间复杂度保证是非常合理的,而自定义程序有时会执行得很糟糕。大多数程序 运行 在(伪)线性时间中运行被认为是 非常快 。尽管可以针对可由正则表达式执行的每项任务构建优于正则表达式的定制算法,但人类通常不容易做到这一点。因此正则表达式保证足够快算法的构造。

  • 正则表达式的大部分性质是可判定的:两个正则表达式是否确定同一组字符串等是可判定的。因此在其上定义了整个代数。程序的所有(非平凡的,语言不变的)属性都是不可判定的:这是 Rice's theorem 的结果,所以你不能一般地证明两个程序会做同样的事情(是等价的),而这是正则表达式的简单任务。

  • 可修改。也许您想删除路径的第一部分,但前提是它不是 ..。一般来说,对正则表达式的修改往往很容易,而修改程序可能会增加代码的大小。

问题最大的部分是并不是所有的程序员都熟悉正则表达式,而且它们有点神秘:语义有时有点难以猜测。此外,pumping lemma 指出并非每个问题都可以转换为正则表达式(问题)。