如果存在子字符串,则拆分字符串

时间:2015-10-15 12:00:04

标签: regex scala

我有两个字符串,如:

" Nikon Coolpix AW130 16MP 使用5倍光学变焦拍摄和拍摄数码相机黑"

" Nikon Coolpix AW130 16 MP Point&拍相机黑"

我正在尝试比较这些字符串,因为你可以看到它们都是相同的,当我基于空格进行标记并比较每个单词时,第二个字符串中16和MP之间的空格将导致实际上不存在的差异

无论如何我可以在第一个字符串中添加一个空间,其中16MP在一起,这样我就可以根据空间正确地进行标记。

val productList=List("Nikon Coolpix AW130 16MP Point and Shoot Digital Camera Black with 5x Optical Zoom","Nikon Coolpix AW130 16 MP Point & Shoot Camera Black")
val tokens = ListBuffer[String]()
  productList.split(" ").foreach(x => {
      tokens += x
  })

  val res = tokens.toList

4 个答案:

答案 0 :(得分:3)

如果您只想删除数字和固定MP字符串之间的空格,可以使用以下正则表达式:

scala> "Nikon Coolpix AW130 16 MP Point & Shoot Camera Black".replaceAll("""(\d+) ?(MP)""", "$1$2")
res13: String = Nikon Coolpix AW130 16MP Point & Shoot Camera Black
  • (\d+)部分匹配任何至少有1位数的
  • ?(注意空格)匹配0或一个空格
  • (MP)部分字面匹配字符串MP
  • $1$2打印附加到第二个参数(\d+)的匹配项的第一个括号(MP)的匹配内容 - 省略该空格(如果有)。

之后,16MP令牌应该相等。不过,您仍会遇到and&的问题。

答案 1 :(得分:0)

您可以使用RegEx执行此操作。 搜索两种格式并将其替换为特定格式。 RegeEx Test

答案 2 :(得分:0)

您没有提供有关这些字符串格式的足够详细信息,但从此示例中我可以推断出类似的内容:(\w+) (\d+)\s*MP Point.*

然后,您可以解析字符串并读取正则表达式的组以比较产品。

以下是一个例子:

def main(args: Array[String]): Unit = {   
    val s0 = "Nikon Coolpix AW130 16MP Point and Shoot Digital Camera Black with 5x Optical Zoom"
    val s1 = "Nikon Coolpix AW130 16 MP Point & Shoot Camera Black"
    println(Product.parse(s0) == Product.parse(s1)) // prints true
}

case class Product(name: String, resolution: Int)
object Product {
    private val regex = new Regex("(\\w+) (\\d+)\\s*MP Point.*", "productName", "resolution")
    def parse(s: String) = regex.findFirstMatchIn(s) match {
        case Some(m) => Product(m.group("productName"), m.group("resolution").toInt)
        case None    => throw new RuntimeException("Invalid format")
    } 
}

答案 3 :(得分:0)

而不是拆分,更容易进行正则表达式替换;连续。

public static boolean equivalent(Sting a, String b) {
     normalize(a).equalsIgnoreCase(normalize(b));
}

private static String normalize(String s) {
    return s.replaceAll("(\\d+)", "$0 ") // At least one space after digits.
        .replaceAll("\\bLimited\\b", "Ltd") // Example.
        .replace("'", "") // Example.
        .replace("&", " and ")
        .replaceAll("\\s+", " ") // Multiple spaces to one.
        .trim();
}

或者对规范化字符串进行拆分(获取关键字)。