4

匹配给定字符串中存在的所有一组模式的最佳方法是什么。例如,假设我有数千个中等长度的字符串(每个大约 30-50 个字符)的集合。用户需要能够指定将评估每个字符串的一组模式(甚至不是模式,实际上只是一系列字符),字符串必须包含所有指定的模式。

所以假设用户想要评估以下模式:

123
xyz
abc

一个字符串,如:

john_smith_123456_abcdef_9999_tuv 

将是错误的,因为它只包含 3 个中的 2 个,而字符串如下:

jane_doe_abcdef_123_9999_tuvwxyz 

会是真的,因为它包含所有 3

那么首先,regex 还是 string.Contains()?还是有一个权衡点,其中一个表现比另一个更好?其次,假设正则表达式是要走的路,那么用于这种情况的最佳正则表达式类型是什么?

多谢!

4

5 回答 5

1

以下正则表达式将起作用:

^(?=.*123)(?=.*xyz)(?=.*abc).*$

这使用前瞻来确保您要查找的三个子字符串包含在字符串中的某个位置,然后.*如果找到所有子字符串,则用于使用整个字符串。

于 2012-04-10T21:48:10.987 回答
1

您正在寻找的是大字符串中的特定字符串,对吗?如果是这样,正则表达式在这里不会对你有多大好处。当然,你可以做一些前瞻性的事情,但你并没有真正获得任何东西——无论是在可读性方面,还是在性能方面。正则表达式用于查找文本中的模式,而不是子字符串

只需遍历列表、数组等...并使用 . 查找每个子字符串Contains

于 2012-04-10T21:49:42.470 回答
1

正则表达式几乎总是简单匹配的较慢选项。String.Contains()除非您确实需要正则表达式功能,否则您应该使用它。如果只允许用户输入实际字符串进行测试,则不需要正则表达式。

于 2012-04-10T21:50:10.597 回答
0

没有经验法则来决定基于正则表达式的解决方案何时会太慢。事实上,没有理由期望正则表达式比任何其他技术都慢。像任何其他工具一样,如果您有能力使用它并且它似乎提供了最简单的方法,请继续尝试。当您编写了足够多的代码以使测试变得有意义时,请对其进行基准测试。

此外,如果模式如此简单以至于您可以使用,那么弄乱正则表达式并创建共振级联灾难性回溯场景Contains()的可能性也很小。请记住:正则表达式不会炸 CPU,正则表达式作者会。:D

我倾向于同意您对FJ提出的多重前瞻方法的看法;这份工作可能太慢了。Contains()它实际上与多次调用相同,但由于回溯而产生了额外的开销。无论如何都值得测试,但我会先尝试这种方法:

^(?>(?:123()|xyz()|abc()|.)+$\1\2\3)

前瞻方法必须扫描每个搜索词的整个字符串,而这个正则表达式只扫描一次,并且永远不会回溯。每次它在一个搜索词上命中时,紧随该词的捕获组被认为参与了比赛,即使它什么也没捕获。当到达字符串末尾时,如果该组参与匹配,则每个反向引用再次“不匹配”;否则它报告失败并且整体匹配失败。

于 2012-04-11T01:07:34.790 回答
0

对于这样一个简单的任务,正则表达式似乎有点矫枉过正。您实际上并不是在寻找一个模式,而是一个子字符串,在这种情况下String.Contains()非常适合这项工作(假设您没有没有告诉我们的“隐藏”要求)。

于 2012-04-10T21:50:15.747 回答