匹配给定字符串中存在的所有模式集的最佳方法是什么。例如,假设我有一千个中等长度的字符串集合(每个字符串大约30-50个字符)。用户需要能够指定一组模式(甚至不是模式只是一系列字符),每个字符串都将被评估,字符串必须包含指定的所有模式。
因此假设用户想要评估以下模式:
123
xyz
abc
字符串如:
john_smith_123456_abcdef_9999_tuv
将为false,因为它只包含3中的2个,而字符串如下:
jane_doe_abcdef_123_9999_tuvwxyz
会是真的,因为它包含所有3
首先,正则表达式或string.Contains()?或者是否有一个交易点,其中一个表现优于另一个?第二,假设正则表达式是要走的路,那么用于这种情况的正则表达式的最佳类型是什么?
非常感谢!
答案 0 :(得分:1)
以下正则表达式将起作用:
^(?=.*123)(?=.*xyz)(?=.*abc).*$
这使用lookaheads来确保您要查找的三个子字符串包含在字符串中的某个位置,然后在找到所有子字符串时使用.*
来使用整个字符串。< / p>
答案 1 :(得分:1)
你要找的是大字符串里面的特定字符串,对吧?如果是这样的话,正则表达式对你来说不会那么好。当然,你可以做一些前瞻性的事情,但你还没有真正获得任何东西 - 无论是可读性还是表现性。正则表达式用于在文本中查找模式,而不是子串。
只需遍历列表,数组,等等......并使用Contains
查找每个子字符串。
答案 2 :(得分:1)
正则表达式几乎总是简单匹配的较慢选项。您应该使用String.Contains()
,除非您确实需要正则表达式功能。如果只允许用户输入要测试的实际字符串,则不需要正则表达式。
答案 3 :(得分:0)
对于这样一个简单的任务来说,正则表达似乎有些过分。你不是真的在寻找一个模式而是一个子串,在这种情况下String.Contains()
非常适合这项工作(假设你没有“隐藏”的要求,你没有告诉过我们。)
答案 4 :(得分:0)
决定基于正则表达式的解决方案何时会太慢,没有经验法则。事实上,没有理由期望正则表达式比任何其他技术都慢。像任何其他工具一样,如果你合理地使用它并且它似乎提供了最简单的方法,那就继续尝试吧。如果您已经为测试编写了足够有用的代码,请对其进行基准测试。
此外,如果模式非常简单,你可以使用Contains()
,那么搞乱正则表达式和创建共振级联灾难性回溯场景的可能性也很小。请记住:正则表达式不会炒掉CPU,正则表达式的作者会这样做。 :d
我倾向于同意你关于FJ提出的多前瞻方法;这项工作可能太慢了。它实际上与多次调用Contains()
相同,但由于回溯而产生额外开销。无论如何它值得测试,但我首先尝试这种方法:
^(?>(?:123()|xyz()|abc()|.)+$\1\2\3)
前瞻方法必须扫描每个搜索词的整个字符串,这个正则表达式只扫描一次,它永远不会回溯。每当它在搜索词上受到攻击时,紧接该词后面的捕获组被称为参与了比赛,即使它没有捕获任何内容。当到达字符串的末尾时,如果组参与了匹配,则每个反向引用“再没有匹配”;否则报告失败,整体匹配失败。