Шаблон регулярного выражения в Java для замены всего, кроме определенной последовательности токенов - PullRequest
1 голос
/ 13 июля 2020

Мне нужно создать метод, который будет извлекать слова из текста без чего-либо (пунктуация и c.), Кроме самих слов в нижнем регистре.

НО я боролся 2 часа с шаблоном регулярного выражения и столкнулся с такая проблема. В тексте есть такие слова, как «50-летие». И с моим регулярным выражением вывод будет выглядеть так:

-год

Вместо обычного

года

Но я не могу заменить da sh символ "-" , потому что нужно оставить другие слова с дефисом.

Вот код:

 public List<String> retrieveWordsFromFile() {
        List<String> wordsFromText = new ArrayList<>();

        scanner.useDelimiter("\\n+|\\s+|'");

        while (scanner.hasNext()) {
            wordsFromText.add(scanner.next()
                .toLowerCase()
                .replaceAll("^s$", "is")
                .replaceAll("[^\\p{Lower}\\-]", "")
            );
        }
        wordsFromText.removeIf(word -> word.equals(""));
        return wordsFromText;
    }

Итак, как я могу сказать, что мне нужно заменить все кроме текста и слов на da sh, начиная только с буквы / s . Значит, эта строка регулярного выражения, вероятно, должна быть такой "объединенной" в одну последовательность?

1 Ответ

0 голосов
/ 13 июля 2020

Используйте регулярное выражение, \\b[\\p{Lower}]+\\-[\\p{Lower}]+\\b|\\b[\\p{Lower}]+\\b

Демо:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        // Test strings
        String[] arr = { "Hello world", "Hello world 123", "HELLO world", "50-year", "stack-overflow" };

        // Define regex pattern
        Pattern pattern = Pattern.compile("\\b[\\p{Lower}]+\\-[\\p{Lower}]+\\b|\\b[\\p{Lower}]+\\b");

        for (String s : arr) {
            // The string to be matched
            Matcher matcher = pattern.matcher(s);

            while (matcher.find()) {
                // Matched string
                String matchedStr = matcher.group();

                // Display the matched string
                System.out.println(matchedStr);
            }
        }
    }
}

Вывод:

world
world
world
year
stack-overflow

Объяснение регулярного выражения:

  1. \b вид границы слова .
  2. + определяет один или несколько символов .
  3. | указывает OR

Вот как вы можете отбросить несоответствующий текст:

public class Main {
    public static void main(String[] args) {
        // Test strings
        String[] arr = { "Hello world", "Hello world 123", "HELLO world", "50-year", "stack-overflow", "HELLO",
                "HELLO WORLD", "&^*%", "hello", "123", "1w23" };

        // Regex pattern
        String regex = ".*?(\\b[\\p{Lower}]+\\-[\\p{Lower}]+\\b|\\b[\\p{Lower}]+\\b).*";

        for (String s : arr) {
            // Replace the string with group(1)
            String str = s.replaceAll(regex, "$1");

            // If the replaced string does not match the regex pattern, replace it with
            // empty string
            s = !str.matches(regex) ? "" : str;

            // Display the replaced string if it is not empty
            if (!s.isEmpty()) {
                System.out.println(s);
            }
        }
    }
}

Вывод:

world
world
world
year
stack-overflow
hello

Объяснение замены:

  1. .*? соответствует всему неохотно т.е. до того, как он уступит место следующему шаблону.
  2. s.replaceAll(regex, "$1") заменит s на group (1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...