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