Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式不使用流筛选器()_Java_Regex_Lambda_Java 8_Java Stream - Fatal编程技术网

Java 正则表达式不使用流筛选器()

Java 正则表达式不使用流筛选器(),java,regex,lambda,java-8,java-stream,Java,Regex,Lambda,Java 8,Java Stream,在Java8中使用新的流时,我试图从一行中提取某些文本 这就是我读到的: 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)){

在Java8中使用新的
时,我试图从一行中提取某些文本

这就是我读到的:

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());
            }
Path Path=Path.get(“./src/main/resources/”,“data.txt”);
try(流行=文件。行(路径)){
List temps=new ArrayList();
线
.filter(行->行.包含(“[core1]”)
.filter(行->行.contains(“(\\d+).*”)
.flatMapToInt(温度->IntStream.of(Integer.parseInt(温度)))
.forEach(System.out::println);
System.out.print(temps.size());
}
我已经检查了regex表达式,它似乎工作正常。 另外,如果我只搜索
[core1]
字符串,它会找到它

问题是,当所有这些一起使用时,我得到0个匹配项。 我现在的逻辑是,我读一行,看看它的核心是什么,然后得到它前面的数字。之后,我想把它添加到一个列表中


我在这里做错了什么?

包含
仅适用于字符串(不支持正则表达式)。。。您可以使用
line.matches(“(\\d+).*”)
来实现相同的功能。

阅读contains()的javadoc:。它接受正则表达式吗?什么也没说。有坚强的支持是合乎逻辑的。有什么方法可以让它以某种黑客风格工作吗?我想你是在寻找
字符串匹配项
而不是
包含
。。。尽管在调用
parseInt
之前需要从行中提取整数。通过使用一个元素创建一个
IntStream
来调用
flatMapToInt
,并不是很有用。只要使用
mapToInt
就可以了…@Kaspar如果javadoc说:“当且仅当该字符串包含指定的字符值序列时才返回true。”,那么不,它支持正则表达式是不符合逻辑的。方法不会做你认为他们会做的事。他们按照文件上说的做。与您的问题无关,但不需要为单个项目进行flatMapToInt。简单使用mapToInt
.mapToInt(Integer::parseInt)
如果文件很大,可以缓存已编译的正则表达式以提高速度<代码>模式是线程安全的(不可变的),因此,如果需要,您甚至可以在多线程上下文中使用它。@Giovanni Botta:对,如果您有一个已编译的模式,您可以使用它创建一个过滤器,这样您仍然可以在一行中完成:
.filter(Pattern.compile(“[core1]”).asPredicate()).filter(Pattern.compile(“(\\d+).*).asPredicate())