Как узнать из \\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 Строку со всеми знаками пунктуации можно не получать каждый раз, а хранить в константе.

→ Ссылка