Test 1 Test 2 Test 3 Test 11
Match: 1 Match: 2 Match: 3 Match: 11
Match: 1
该方案是:
void addMysteries( Path path, String output) {
Pattern p = Pattern.compile(".?Test (.)");
try (Stream<String> lines = Files.lines( path)) {
lines.map( p::matcher)
.filter(Matcher::matches)
.forEach( matcher -> System.out.println("Match: " + matcher.group(1)));
} catch( Exception e) {
e.printStackTrace();
}
}
在Java7中,下面的软件运行良好。为什么这个管用而上面不管用?
pattern = Pattern.compile(".?Test (.)");
input = "Test 1\n\rOtherStuff\nTest 2 Test 3";
matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println( "Match: " + matcher.group( 1));
}
您必须对每一行使用matcher
,您的代码应该如下所示:
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(line ->
{
Matcher matcher = pattern.matcher(line);
while (matcher.find()){
System.out.println("Match: " + matcher.group(1));
}
}
);
} catch (Exception e) {
e.printStackTrace();
}
在Java9+中,您可以在第二个示例中使用matcher#results()
,因此可以是:
Pattern pattern = Pattern.compile(".?Test (.)");
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(input -> pattern.matcher(input)
.results()
.forEach(matcher -> System.out.println("Match: " + matcher.group(1)))
);
} catch (Exception e) {
e.printStackTrace();
}
或者正如@Holger提到的,您可以将FlatMap
与Matcher#results()
一起使用,如下所示:
try (Stream<String> lines = Files.lines(path)) {
lines.flatMap(input ->
pattern.matcher(input).results()
).forEach(matchResult -> System.out.println("Match: " + matchResult.group(1)));
} catch (IOException e) {
e.printStackTrace();
}
甚至可以使用Scanner读取整个文件,其中可以使用Scanner::FindAll
,它返回如下所示的流:
try (Scanner scanner = new Scanner(path)) {
scanner.findAll(pattern).forEach(matchResult ->
System.out.println("Match: " + matchResult.group(1))
);
} catch (IOException e) {
e.printStackTrace();
}
产出
Match: 1
Match: 2
Match: 3
您可以查看@Holger的results()
和findall()
的两个后端口:
如何使此过滤器在同一文本中的多个匹配项上工作? 这是返回链接的函数 使用筛选器的示例文本: Ut[点击这里|节点: 4]enim ad minim veniam,quis[点击这里|术语: 42]nostr的练习ullamco的劳动是新的和其他的结果。Duis ate irure Dolor in re的谴责在流言蜚语velit esse cilum[点击这里|术语: 1]Dolore eu fu
问题内容: 我需要实施 其中ptrn是命令提示符样式模式,例如“ * 2010 * .txt” 我熟悉FilenameFilter类,但 由于String.matches()不接受此类模式而无法实现 。 谢谢! 问题答案: 所述接受的正则表达式 模式。 “ layman’s”变体的regex变体为。 因此,以下应该工作: 双反斜杠只是用来表示实际的反斜杠,因为反斜杠本身是Java中的转义字符。 另
我在ES中有一个多匹配查询,希望添加一个过滤器。 添加此筛选器的语法是什么? 我试过:
还有,如果真的要给出另一个模式,“/restful/**”不是更好吗?因为“/**”将匹配与“/RESTFUL/**”不匹配的URL,因此不由此筛选器链处理。
问题内容: 有时你想过滤具有多个条件的a: 或者你可以做同样的复杂条件和单 filter: 我的猜测是第二种方法具有更好的性能特征,但我不知道。 第一种方法赢得了可读性,但是哪种性能更好? 问题答案: 两种选择都必须执行的代码是如此相似,以致你无法可靠地预测结果。底层的对象结构可能有所不同,但这对热点优化器没有挑战。因此,这取决于其他周围条件,如果有任何差异,它们将使执行速度更快。 组合两个过滤器
问题内容: 我已经使用Python和Django建立了一个在线画廊。我刚刚开始添加编辑功能,从旋转开始。我使用sorl.thumbnail按需自动生成缩略图。 当我编辑原始文件时,我需要清理所有缩略图,以便生成新的缩略图。每个图片有三到四个(我在不同场合有不同的图片)。 我 可以 在文件变量中进行硬编码…但是这很混乱,如果我改变工作方式,则需要重新访问代码。 理想情况下,我想进行正则删除。用正则表