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

时间:2014-04-28 01:52:33

标签: java regex search match

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

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

1 个答案:

答案 0 :(得分:2)

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

  1. Pattern.matcher().matches()带有按需Pattern实例(为每次运行创建)
  2. Pattern.matcher().matches()带有缓存的Pattern实例(在所有运行之前创建)
  3. String.equals()表示数组中的每个元素,在循环中执行
  4. Set.contains()在缓存的Set(在所有运行之前创建)
  5. 数据集:输入数组,包含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()

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