我正在抓取电子商务网站的一些数据。
数据可以是......
Moto G (Black, with 16 GB)
Apple iPhone 5S (Gold, with 16 GB)
Apple iPhone 5S (Space Grey, with 16 GB)
我希望数据采用以下形式:
Moto G 16
Apple iPhone 5S 16
Apple iPhone 5S 16
如果产品在原始字符串中可用,则该产品应包含存储大小。
我在java中的尝试:
str.replaceAll("(GB|gb|gB|Gb)|Gold|Silver|Space|dual|Dual|DUAL|sim|Sim|SIM|with|(^\\W*)|(\\?.*)|(( - \\w*).*)|((,).(^[0-9])*)|(\\((\\w*,*)*\\))|(\\(\\)*)|(\\)*)", "")
这不能正常工作。它也是硬编码的。有什么帮助吗?
更新:删除了最后一个条件
答案 0 :(得分:1)
不要使用regexp,使用字符串编写一小段代码来查找每行所需的信息。此外,请确保在给出存储大小时,它以一些您正确理解的预定义格式给出。否则,您可能无法区分说存储大小16和模型包含字符串16的设备。
答案 1 :(得分:1)
以下是感兴趣/被删除的所有内容都在括号中的答案。
result = str.replaceFirst("\\((?:.*?(\\d+)\\s*GB.*|.*)\\)", "$1"));
取代如下:
答案 2 :(得分:0)
我不建议使用一个大的正则表达式来处理它。我建议你先解决问题:
private static final Pattern MEMORY_SIZE_PATTERN = Pattern.compile("\\b(\\d+) GB");
public static void main(String[] args) {
List<String> phones = Arrays.asList("Moto G (Black, with 16 GB)",
"Apple iPhone 5S (Gold, with 16 GB)",
"Apple iPhone 5S (Space Grey, with 16 GB)",
"Nokia X Dual SIM Price");
for (String phone : phones) {
String memory = extractMemory(phone);
phone = phone.replaceAll("\\(.*\\)", "");
phone = phone.replaceAll("Dual SIM Price", "");
String normalizedPhone = String.format("%s %s", phone.trim(), memory);
System.out.println(normalizedPhone);
}
}
private static String extractMemory(String phone) {
Matcher memoryMatcher = MEMORY_SIZE_PATTERN.matcher(phone);
if (memoryMatcher.find()) {
return memoryMatcher.group(1);
}
return "";
}
输出:
Moto G 16
Apple iPhone 5S 16
Apple iPhone 5S 16
Nokia X
答案 3 :(得分:0)
对于正则表达式,这不是一个完美的例子,但是如果你仍然想要使用正则表达式而不是需要使用OR
运算符的两个模式,那么
String str= "Moto G (Black, with 16 GB)";
Pattern p = Pattern.compile("(.*)\\(.*,.*[Ww]ith(.*)[Gg][Bb]\\)|(.*)Dual.*");
Matcher m = p.matcher(str);
if(m.matches()) {
System.out.println((m.group(1)!=null?m.group(1):"")+(m.group(2)!=null?m.group(2):"")+(m.group(3)!=null?m.group(3):""));
}
希望这能为您提供一个起点并帮助您获得解决方案。
答案 4 :(得分:0)
这适用于除最后一个之外的所有人;最后一个以不同的格式给出。
sed -r -e 's:^([a-zA-Z0-9 ]+).* ([0-9]+) GB.*:\1 \2:' < test.txt