正则表达式找到子字符串

时间:2014-05-13 08:37:44

标签: java regex

我正在抓取电子商务网站的一些数据。

数据可以是......

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*,*)*\\))|(\\(\\)*)|(\\)*)", "")

这不能正常工作。它也是硬编码的。有什么帮助吗?

更新:删除了最后一个条件

5 个答案:

答案 0 :(得分:1)

不要使用regexp,使用字符串编写一小段代码来查找每行所需的信息。此外,请确保在给出存储大小时,它以一些您正确理解的预定义格式给出。否则,您可能无法区分说存储大小16和模型包含字符串16的设备。

答案 1 :(得分:1)

以下是感兴趣/被删除的所有内容都在括号中的答案。

result = str.replaceFirst("\\((?:.*?(\\d+)\\s*GB.*|.*)\\)", "$1"));

取代如下:

  • 找到外括号,如果在其中有多个数字, 然后是任意数量的可选空格,后跟GB,然后捕获 将数字转换为第1组。
  • 否则不捕获任何群组。
  • 将匹配的外括号替换为可选组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