java - 正则表达式匹配或数组搜索

标签 java regex search match

假设我有 60 个单词,我想检查输入是否是这些单词中的任何一个

哪个更快:
1) 制作一个正则表达式并对其中的单词进行 ORing
2) 在数组上循环并搜索?

最佳答案

您可以自己轻松测试。出于好奇,我创建了一个 test case四种不同的场景:

  1. Pattern.matcher().matches() 带有按需 Pattern 实例(为每次运行创建)
  2. Pattern.matcher().matches() 带有缓存的 Pattern 实例(在所有运行之前创建)
  3. String.equals() 针对数组中的每个元素,在循环中执行
  4. Set.contains() 在缓存的 Set 上(在所有运行之前创建)

数据集:输入数组包含 6000 个随机生成的字符串,每个字符串包含 6 个字符。每个测试执行 10,000 次,对所有运行的结果求和并取平均值。

结果(所有时间均以毫秒为单位 - 越低显然越好)。第一个数字是所有 10,000 次运行的总执行时间,第二个数字是每次运行的平均值:

On-Demand Regex:    12934 (1.29 avg)
Pre-compile Regex:    458 (0.05 avg)
Loop:                  77 (0.01 avg)
Set.contains:           4 (0.00 avg)

长话短说:如果您要使用正则表达式(您不应该这样做),至少要创建并缓存 Pattern。但假设性能很重要,如果您提前知道单词列表,您就不会击败 Set.contains()

注意 按需正则表达式测试包括构造提供给 Pattern.compile() 方法的 StringBuilder 实例的成本,所以不一定所有的额外时间都花在正则表达式编译上。 Set.contains 测试还有一个小小的优势,那就是它是内联的,并且避免了方法调用的额外堆栈创建。我修改了测试,让它在一个单独的方法中执行,但这并没有对结果产生实质性影响。

关于java - 正则表达式匹配或数组搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23331359/

相关文章:

Swift 自动完成 firebase 搜索

java - 如何处理嵌套静态转换?

java - 从抽屉式导航栏登录

java - java奇怪的递归优化

java - 由于 id 为空,Grails 属于关系在保存时失败

MySQL SELECT LIKE 或 REGEXP 匹配一条记录中的多个单词

javascript - 正则表达式相同的参数

java - solrj中的Document.addField和Document.setField有什么区别?

c - 具有全局值的回溯的递归差异?

Python 正则表达式词距