2015-04-22 108 views
4

我试图从一条线,我在Java中使用新Stream时获得一定弄出来的文字工作8正则表达式不流过滤器()

这是我正在读:

46 [core1] 
56 [core1] 
45 [core1] 
45 [core2] 
67 [core2] 
54 [core2] 

这里是我目前看它的代码:

Path path = Paths.get("./src/main/resources/", "data.txt"); 
      try(Stream<String> lines = Files.lines(path)){ 
       List<Integer> temps = new ArrayList<>(); 
       lines 
         .filter(line -> line.contains("[core1]")) 
         .filter(line -> line.contains("(\\d+).*")) 
         .flatMapToInt(temperature -> IntStream.of(Integer.parseInt(temperature))) 
         .forEach(System.out::println); 
       System.out.print(temps.size()); 
      } 

我在https://www.regex101.com/检查正则表达式,它似乎很好地工作。 另外,如果我只是搜索[core1]字符串,它会发现它。

问题是,当所有这一切使用时,我得到0匹配。 我目前的逻辑是我读了一行,看看它是什么核心,然后得到它的数字。之后我想将它添加到列表中。

我在这里做错了什么?

+0

阅读contains()的javadoc:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#contains%28java.lang.CharSequence%29。它接受正则表达式吗? –

+0

对此不作任何说明。支持强硬是合乎逻辑的。任何方式让这个工作在一些黑客风格? – Kaspar

+1

我想你正在寻找'String#matches'而不是'contains' ......虽然你需要在调用'parseInt'之前从行中提取整数。通过用一个元素创建一个IntStream来调用'flatMapToInt'并不是很有用。只需使用'mapToInt'代替... –

回答

9

contains仅适用于字符串(不支持正则表达式)...您可以使用line.matches("(\\d+).*")实现相同。

+0

Works像一个魅力,将接受这个答案。 – Kaspar

+0

很高兴帮助..并感谢:) –

+5

如果您的文件非常大,您可以缓存编译后的正则表达式['Pattern'](http://docs.oracle.com/javase/7/docs/api/java/ util/regex/Pattern.html)以提高速度。 'Pattern'是线程安全的(不可变的),所以如果需要的话你甚至可以在多线程环境中使用它。 –