【问题标题】:Using RegEx for simple operations使用 RegEx 进行简单操作
【发布时间】:2015-04-02 09:44:44
【问题描述】:

我想知道是否有人会出于某种原因想要使用正则表达式来解决也可以轻松编写而不使用正则表达式的问题。

因为this question而产生这个想法。

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

问题摘要:
删除 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 解决方案是否有更好的性能?

【问题讨论】:

    标签: regex code-readability


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答!因此(至少)对于我的问题中使用的示例,使用正则表达式是一个好主意(imo,特别是因为您所说的“可修改性”点),但由于其可读性问题,还要添加评论这解释了该表达式将完成什么?
    • 好吧,在这种情况下,您还可以使用.replaceFirst 进一步提升它。并且一些注释通常是一个好主意(或将其封装在定义目的的方法中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2012-08-26
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    相关资源
    最近更新 更多