我有两个字符串,如:
" 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
答案 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)
答案 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();
}
或者对规范化字符串进行拆分(获取关键字)。