Домой java Примеры регулярных выражений Java

Примеры регулярных выражений Java

843

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 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

Примеры регулярных выражений Java

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Как рассчитать разницу времени и даты в Java