Как узнать из \\p{Punct}, какие символы не вошли в строку?
package Pattern;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Filter {
public static void main(String[] args) {
Pattern p = Pattern.compile("[\\p{Punct}&&[^\"]]");
Matcher m = p.matcher(" Привет, друг! Как дела? У вот плохая погода...");
while (m.find()) {
System.out.println(m.start() + " " + m.group() + " ");
}
System.out.println("");
}
}
Ответы (1 шт):
Автор решения: afjord
→ Ссылка
Ничего менее многословного не придумал, но задачу это решит:
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("([\\p{Punct}&&[^\"]])");
Matcher m = p.matcher(" Привет, друг./! Как дела? У вот плохая погода...");
//Получить все знаки пунктуации из входной строки
StringBuilder sb = new StringBuilder();
while (m.find()) {
sb.append(m.group());
}
System.out.printf("%-60s %s\n", "All punctuation marks from input:", sb);
//Избавляемся от возможных повторов и конвертируем оставшиеся знаки в строку
List<String> list = sb.codePoints()
.distinct()
.mapToObj(value -> Character.toString((char) value))
.collect(Collectors.toList());
sb = new StringBuilder();
for (String s : list) {
sb.append(s);
}
String distinctPunctsFromInp = sb.toString();
System.out.printf("%-60s %s\n", "Distinct punctuation marks from input:", distinctPunctsFromInp);
//Создаём поток всех char
IntStream stream = IntStream.rangeClosed(0, Character.MAX_VALUE);
String result = stream
//Отфильтровываем не знаки препинания
.filter(value -> Pattern.matches("\\p{Punct}", String.valueOf((char) value)))
//Отфильтровываем знаки препинания, которые есть в stringPunctFromPattern
.filter(value -> distinctPunctsFromInp.indexOf(value) == -1)
//Конвертируем String
.mapToObj(value -> Character.toString((char) value))
.collect(Collectors.toList())
.toString()
.replaceAll("[\\[\\], ]", "");
System.out.printf("%-60s %s\n", "Punctuation marks that are missing from the input string:" , result);
}
}
UPD Строку со всеми знаками пунктуации можно не получать каждый раз, а хранить в константе.