Как заставить программу выводить целые слова с помощью Pattern и Matcher - PullRequest
4 голосов
/ 01 мая 2020

У меня есть текст (например, "All Java programmers program good programs."), и мне нужно вывести все слова, в которых есть program.

Pattern pattern = Pattern.compile("program");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    System.out.println(matcher.start() + " " + extractWord(matcher.start(), text));
}

Могу ли я написать Pattern, который в целом найдет такие слова, как " программисты "как Matcher результат?

Я сам написал метод extractWord как:

public static String extractWord(int start, String line) {
    int n = 0;
    while (start + n < line.length()) {
        if (line.charAt(start + n) == ' ' || line.charAt(start + n) == '.') {
            break;
        } else {
            n++;
        }
    }
    return line.substring(start, start + n);
}

, но мне не нравится это делать.

Ответы [ 3 ]

3 голосов
/ 01 мая 2020

Простое решение состояло бы в изменении вашего регулярного выражения на \w*program\w*. Это будет соответствовать любому слову, содержащему program, и любым возможным префиксам и суффиксам, состоящим из символов слова (т. Е. Буква, цифра и подчеркивание). Затем используйте matcher.group() для извлечения вхождений, найденных средством сопоставления.

Более продвинутый подход будет использовать регулярное выражение [a-z]*program[a-z]*. Это будет соответствовать любому слову, содержащему program и любым возможным префиксам и суффиксам, состоящим только из букв. Флаг Pattern.CASE_INSENTITIVE соответствует буквам как в нижнем, так и в верхнем регистре).

Java (OpenJDK 8) , 856 байтов

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

public class Main
{
    public static final String simpleText = "All Java programmers program good programs.";
    public static final String complexText = "All Java deProGraMMers Program good pRoGrAmS.";

    public static void main(String[] args)
    {
        System.out.println("Groups for '" + simpleText + "':");
        printGroups(simpleText);
        System.out.println("Groups for '" + complexText + "':");
        printGroups(complexText);
    }

    private static void printGroups(String text)
    {
        String regex = "[a-z]*program[a-z]*";
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(text);
        while (matcher.find())
        {
            System.out.println(matcher.group());
        }
    }
}

Результат выполнения:

 Groups for 'All Java programmers program good programs.':
 programmers
 program
 programs

 Groups for 'All Java deProGraMMers Program good pRoGrAmS.':
 deProGraMMers
 Program
 pRoGrAmS

Попробуйте онлайн!

1 голос
/ 01 мая 2020

Попробуйте с этим регулярным выражением: \b\w*program\w*\b ..

  • \b - означает начать с границы слова
  • \w* - означает, что может быть 0 или более символ слова
  • program - программа соответствия
  • \w* - означает, что может быть 0 или более символов слова
  • \b - означает конец слова граница

код:

String text = "All Java programmers program good programs.";
Pattern pattern = Pattern.compile("\\b\\w*program\\w*\\b");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    System.out.println(matcher.group());
}
0 голосов
/ 01 мая 2020

Я бы хотел что-то подобное, используя метод String.contains():

String str = "All Java programmers program good programs.";
String[] arr = str.split(" ");
for (String s : arr)
    if(s.contains("program"))
        System.out.println(s);

//output: 
//programmers
//program
//programs.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...