Содержание
Java 8 поток и примеры регулярных выражений.
Заметка
Изучите основные регулярные выражения в Википедии
1. String.matches (регулярное выражение)
1.1 В этом примере проверьте, является ли строка числом.
JavaRegEx1.java
package com.csharpcoderr.regex;
import java.util.Arrays;
import java.util.List;
public class JavaRegEx1 {
public static void main(String[] args) {
List numbers = Arrays.asList("1", "20", "A1", "333", "A2A211");
for (String number : numbers) {
if (number.matches("\d+")) {
System.out.println(number); // 1, 20, 333
}
}
// Пример потока Java 8
numbers.stream()
.filter(x -> x.matches("\d+"))
.forEach(System.out::println);
}
}
Выход
1
20
333
1
20
333
2. String.replaceAll (регулярное выражение, замена)
2.1 Этот пример заменяет все цифры на #
JavaRegEx2.java
package com.csharpcoderr.regex;
import java.util.Arrays;
import java.util.List;
public class JavaRegEx2 {
public static void main(String[] args) {
List numbers = Arrays.asList("1", "20", "A1", "333", "A2A211");
for (String number : numbers) {
System.out.println(number.replaceAll("\d", "#"));
}
// Пример потока Java 8
numbers.stream()
.map(x -> x.replaceAll("\d", "#"))
.forEach(System.out::println);
}
}
Выход
#
##
A#
###
A#A###
#
##
A#
###
A#A###
3. Шаблон и соответствие
3.1 Найти все цифры из списка строк.
JavaRegEx3.java
package com.csharpcoderr.regex;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaRegEx3 {
public static void main(String[] args) {
List numbers = Arrays.asList("1", "20", "A1", "333", "A2A211");
Pattern pattern = Pattern.compile("\d+");
for (String number : numbers) {
Matcher matcher = pattern.matcher(number);
while (matcher.find()) {
System.out.println(matcher.group(0));
}
}
}
}
Выход
1
20
1
333
2
211
3.2 Для потока Java 8, сначала мы пытаемся преобразовать так:
numbers.stream()
.map(x -> pattern.matcher(x))
.filter(Matcher::find) // A2A211, будет ли цикл?
.map(x -> x.group())
.forEach(x -> System.out.println(x));
Выходной, последний 211 отсутствует?
1
20
1
333
2
Поток не может зациклить .filter чтобы получить все группы, нам нужен хак с кастомом Spliterators
JavaRegEx4.java
package com.csharpcoderr.regex;
import java.util.Arrays;
import java.util.List;
import java.util.Spliterators;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.StreamSupport;
public class JavaRegEx4 {
public static void main(String[] args) {
List numbers = Arrays.asList("1", "20", "A1", "333", "A2A211");
Pattern pattern = Pattern.compile("\d+");
numbers.stream()
.flatMap(x ->
StreamSupport.stream(new MatchItr(pattern.matcher(x)), false))
.forEach(x -> System.out.println(x));
}
final static class MatchItr extends Spliterators.AbstractSpliterator {
private final Matcher matcher;
MatchItr(Matcher m) {
super(m.regionEnd() - m.regionStart(), ORDERED | NONNULL);
matcher = m;
}
public boolean tryAdvance(Consumer super String> action) {
if (!matcher.find()) return false;
action.accept(matcher.group());
return true;
}
}
}
Выход
1
20
1
333
2
211
4. Java 9, Scanner.findAll (регулярное выражение)
4.1 Java 9, мы можем использовать Scanner.findAll(regex) возвращать поток результатов совпадений, соответствующих заданному регулярному выражению.
Scanner scan = new Scanner("A2A211");
List collect = scan
.findAll("\d+")
.map(m -> m.group())
.collect(Collectors.toList());
collect.forEach(x -> System.out.println(x));
Выход
2
211
Финальная версия, с Java 9.
JavaRegEx5.java
package com.csharpcoderr.regex;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class JavaRegEx5 {
public static void main(String[] args) {
List numbers = Arrays.asList("1", "20", "A1", "333", "A2A211");
Pattern pattern = Pattern.compile("\d+");
List collect = numbers.stream()
.map(x -> new Scanner(x).findAll(pattern)
.map(m -> m.group())
.collect(Collectors.toList())
)
.flatMap(List::stream)
.collect(Collectors.toList());
collect.forEach(x -> System.out.println(x));
}
}
Выход
1
20
1
333
2
211
Рекомендации
flatMap java 8 java 9 regex stream
0.00 (0%) 0 votes






