我正在尝试读取一个巨大的文件并提取“引号”中的文本,然后将这些行放入一个集合中,并使用 Java 8 将集合的内容写入文件中Stream
.
public class DataMiner {
private static final Pattern quoteRegex = Pattern.compile("\"([^\"]*)\"");
public static void main(String[] args) {
String fileName = "c://exec.log";
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
Set<String> dataSet = stream.
//How do I Perform pattern match here
.collect(Collectors.toSet());
Files.write(Paths.get(fileName), dataSet);
} catch (IOException e) {
e.printStackTrace();
}
}
}
请帮我。谢谢!
编辑:问题的答案..
- 不,没有多重引用的文本。
- 我本可以使用简单的循环。但我想使用 Java 8 流
不幸的是,Java 正则表达式类不提供匹配结果的流,仅提供一个splitAsStream() https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#splitAsStream-java.lang.CharSequence-方法,但你不想拆分。
注:已经Java 9 中添加 https://bugs.openjdk.java.net/browse/JDK-8071479 as 匹配器.results() http://download.java.net/java/jdk9/docs/api/java/util/regex/Matcher.html#results--.
但是,您可以自己为其创建一个通用帮助器类:
public final class PatternStreamer {
private final Pattern pattern;
public PatternStreamer(String regex) {
this.pattern = Pattern.compile(regex);
}
public Stream<MatchResult> results(CharSequence input) {
List<MatchResult> list = new ArrayList<>();
for (Matcher m = this.pattern.matcher(input); m.find(); )
list.add(m.toMatchResult());
return list.stream();
}
}
然后你的代码通过使用变得很容易flatMap() https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#flatMap-java.util.function.Function-:
private static final PatternStreamer quoteRegex = new PatternStreamer("\"([^\"]*)\"");
public static void main(String[] args) throws Exception {
String inFileName = "c:\\exec.log";
String outFileName = "c:\\exec_quoted.txt";
try (Stream<String> stream = Files.lines(Paths.get(inFileName))) {
Set<String> dataSet = stream.flatMap(quoteRegex::results)
.map(r -> r.group(1))
.collect(Collectors.toSet());
Files.write(Paths.get(outFileName), dataSet);
}
}
由于您一次只处理一行,因此临时List
很好。如果输入字符串很长并且有很多匹配项,那么Spliterator
将是一个更好的选择。看如何创建正则表达式匹配流? https://stackoverflow.com/a/28150956/5221149
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)