【问题标题】:Is regex a good way to see if a string is a substring of another? [closed]正则表达式是查看字符串是否是另一个字符串的好方法吗? [关闭]
【发布时间】:2016-10-18 13:01:56
【问题描述】:

假设我有一个固定的字符串列表。

对于任何输入字符串,我想找出列表中的哪个字符串是输入字符串的子字符串,或者列表中没有这样的字符串。

我的做法是:对于列表中的每个字符串,将其作为一个模式,并使用正则表达式匹配来查看它是否与某处的输入字符串匹配。

使用正则表达式是不是一种矫枉过正的方法?

谢谢。

它是用 C++ 编写的。计划是使用 C++ 标准库或 Boost 库。

【问题讨论】:

  • 有了 17k+,你肯定知道代码比在黑暗中戳要好得多 :)
  • @Webeng He 必须知道任何问题都需要一些代码。
  • 没有充分的理由提出这样的问题,因为答案是肯定的:视情况而定。什么语言?这个问题目前太宽泛了。
  • 正则表达式可以让您指定要检查的整个列表,例如/(foo|bar|baz)/ 在一次调用中,但它仍然会归结为正在执行的循环,并且可能不会比执行一堆 strpos 类型的调用更有效(而且可能更低)。
  • 令人惊讶的是,它被放在 hold 上,因为它太宽泛了。如果那些被搁置的看门人会稍微冷却他们的喷气式飞机,我会发布一个很好的答案。 IS 使用正则表达式的最快方式。将字符串列表放在像 str1|str2|str3|str4|str5 这样的正则表达式交替中,在您获得的每个输入字符串上运行正则表达式。为什么这样更快。 1. 正则表达式变成trie。 2. 来源搜索一次。与您能想到的ANY 其他方式相比,该组合表示性能增加 30-200,000%...编译一次正则表达式就可以了。跨度>

标签: c++ regex string


【解决方案1】:

绝对是矫枉过正。正则表达式需要在构造时编译模式,而您只是在使用常量子字符串进行线性搜索。标准库正是您所需要的:http://www.cplusplus.com/reference/string/string/find/

【讨论】:

  • 更好的链接是string::find
  • 你是对的。我修正了我的答案。
  • 谢谢。 string::find 是否使用 Boyer-Moore 算法来查找一个字符串是否是另一个字符串的子字符串?如果不是,它使用哪种算法?
  • @Tim 见this question。似乎实现不是公开知识,但它不是最快的。
【解决方案2】:

一般来说,不,正则表达式不是在字符串中查找固定子字符串的好方法。

有几种子字符串搜索算法比简单的逐字节搜索更快。其中最受欢迎的是 Boyer-Moore。该网站列出了大部分知名的,包括 Boyer-Moore 及其变体:http://www-igm.univ-mlv.fr/~lecroq/string/index.html

但是,大多数正则表达式引擎实际上在内部使用 Boyer-Moore 来提高性能(正则表达式引擎之间的竞争实际上是一回事)。所以在某些情况下,正则表达式 IS 是一种很好的方法。

但是。既然您提到您正在使用 Boost,那么您应该能够直接使用作为 Boost 一部分的 boyer_moore_search() 而无需借助正则表达式。

但请注意,如果您的搜索字符串很小,Boyer-Moore 效率会很低。对于小的搜索字符串,还有其他算法可以击败它。因此,您可能需要进行一些研究并将算法与您自己的典型搜索字符串进行比较。但总的来说,Boyer-Moore 是一个不错的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2021-04-24
    • 2017-03-05
    • 2013-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多