执行多对多正则表达式搜索的最快方法?

时间:2018-02-13 19:35:03

标签: scala

我们说我有两个字符串列表,这两个字符串都很长。我想在列表之间执行正则表达式匹配,使用第一个列表作为匹配器模式,第二个列表作为目标。

示例:

Index    List1    List2
  0      'abc'    '123456'
  1      '123'    'abcdefgh'
  2      'val'    'down to the valley'

我的输出应以某种形式传达以下信息:

Index 0 of List1 matches with Index 1 of List2
Index 1 of List1 matches with Index 0 of List2
Index 2 of List1 matches with Index 2 of List2

在JVM世界中,有哪些简单匹配的现有技术/库?对于这么简单的事情,OpenNLP似乎有些过分。如果现有的算法经过验证,我也不反对使用我自己的实现。

3 个答案:

答案 0 :(得分:2)

val la = Array("abc", "123", "val")
val lb = Array("123456", "abcdefgh","down to the valley")

for {
  xa <- la.indices
  xb <- lb.indices
  if lb(xb).contains(la(xa))
} yield s"index $xa of A matches index $xb of B"
//res0: IndexedSeq[String] = Vector(index 0 of A matches index 1 of B,
//                                  index 1 of A matches index 0 of B,
//                                  index 2 of A matches index 2 of B)

索引List的效率相当低。 Array对于那种事情更好。

答案 1 :(得分:1)

这是你会考虑的吗?

val list1 = List("abc", "123", "val").zipWithIndex
val list2 = List("123456", "abcdefgh", "down to the valley").zipWithIndex

val result = list1.map {
  case (elmt1, i1) => {
    val matching = list2.filter {
      case (elmt2, i2) => elmt2.contains(elmt1)
    }
    "Index " + i1 + " of List1 matches with Index " +
      matching.map(_._2).mkString(", ") + " of List2"
  }
}

println(result)

它是O(n * m)中的一个天真循环,其中n和m是列表大小。

当列表1的元素不匹配时,这将需要处理副案例(currentlly它会print Index 1 of List1 matches with Index of List2)。

答案 2 :(得分:0)

来自jwvh的无耻副本:

val la = Array("abc", "123", "val")
val lb = Array("123456", "abcdefgh","down to the valley")

自己的偏好:

la.foreach (a => lb.foreach {b => if (b.matches (s".*$a.*")) println (s"match $a:$b")})
match abc:abcdefgh
match 123:123456
match val:down to the valley

对于更大的数据收集,您可以尝试 .par ,这会将整行转换为并行管道。如果您有大量数据,请进行一些测量并回电给我们。 :)

la.par.foreach (a => lb.foreach {b => if (b.matches (s".*$a.*")) println (s"match $a:$b")})