当前位置: 首页 > 面试题库 >

字符串操作与Regexps

谷隐水
2023-03-14
问题内容

经常有人告诉我们,正则表达式运行缓慢,应尽可能避免使用。

但是,考虑到自己做一些字符串操作的开销( 不是在谈论算法错误-这是另一回事 ),尤其是在PHPPerl(也许Java)有什么 限制的
情况下,在这种情况下,我们可以认为字符串操作是更好的方法替代?哪些正则表达式特别使CPU贪婪?

例如,对于下面的C++JavaPHP或者Perl,你会怎么推荐

正则表达式可能会更快:

  • s/abc/def/g... while((i=index("abc",$x)>=0) ...$y .= substr()...基于解决方案?
  • s/(\d)+/N/g 或扫描算法

但是关于

  • 电子邮件验证正则表达式?
  • s/((0|\w)+?[xy]*[^xy]){2,7}/u/g

手工的和特定的算法会更快(写更长的时间)吗?

编辑

问题的重点是确定哪种正则表达式最好通过字符串操作针对给定问题进行重写?

编辑2

常见的实现是Perl regexp。例如在Perl -需要知道它们是如何实现的-什么 样的
正则表达式的是要避免的,因为实现将使过程冗长和无效?它可能不是一个复杂的正则表达式…

编辑2011年7月 (基于评论)

我并不是说所有的正则表达式都很慢。由于某些特定的正则表达式模式的特定处理过程以及其实现方式,因此它们已知速度较慢。
例如,在最近的Perl / PHP实现中,什么是相当慢的-应该避免?
已经进行了自己的研究(分析器…)并且能够提供关于建议/避免的一般指导原则的人们可以得到答案。


问题答案:

使用正则表达式处理文本的一个不错的功能是模式是高级的和声明性的。这为实现留出了很大的优化空间,例如可以排除最长的公共前缀或对静态字符串使用Boyer-
Moore
。简洁的注释使专家可以更快地阅读。我立刻明白

if (s/^(.)//) {
  ...
}

正在做,并且index($_, 0, 1) = ""比较吵。

正则表达式的重要考虑因素是 上限 ,而不是下限。它是一个功能强大的工具,因此人们认为它能够从XML,电子邮件地址或C
++程序中正确提取令牌,并且没有意识到需要更强大的工具(例如解析器)。



 类似资料:
  • 前言 忙活了一个礼拜,终于等到周末,可以空下来写点东西。 之前已经完成《数值运算》和《布尔运算》,这次轮到介绍字符串操作 。咱们先得弄明白两个内容: 什么是字符串? 对字符串有哪些操作? 下面是"在线新华字典"的解释: 字符串:简称“串”。有限字符的序列。数据元素为字符的线性表,是一种数据的逻辑结构。在计算机中可有不同的存储结构。在串上可进行求子串、插入字符、删除字符、置换字符等运算。 而字符呢?

  • 字符串操作 函数 char *  rt_strstr (const char *s1, const char *s2)   判断字符串   rt_uint32_t  rt_strcasecmp (const char *a, const char *b)   忽略大小写比较字符串   char *  rt_strncpy (char *dst, const char *src, rt_ubase_

  • 注意:位操作中的位置是反过来的,offset过大,则会在中间填充0,比如 SETBIT bit 0 1,此时bit为10000000,此时再进行SETBIT bit 7 1,此时bit为10000001。offset最大2^32-1。 GETBIT key offset / SETBIT key offset value 设置某个索引的位为0/1 bitcount 对位进行统计 bitop 对1个

  • SETRANGE key offset value 用value 参数覆写(overwrite)给定key 所储存的字符串值,从偏移量offset 开始。 不存在的key 当作空白字符串处理。可以用作append: 注意: 如果偏移量>字符长度, 该字符自动补0x00,注意它不会报错

  • substr key start end 返回截取过的key的字符串值,注意并不修改key的值。下标是从0开始的

  • append key value 返回新字符串值的长度。