Регулярные выражения игнорируют токены, которые не начинаются с буквы

#java #regex #string #token

#java #регулярное выражение #строка #токен

Вопрос:

как я могу написать регулярное выражение, которое игнорирует любой токен, который не начинается с буквы? его следует использовать в java.

пример: it 's super cool —> регулярное выражение должно соответствовать: [it, super, cool] и игнорировать ['s] .

Ответ №1:

Альтернативное регулярное выражение:

 "(?:^|\s)([A-Za-z] )"
  

Регулярное выражение в контексте:

 public static void main(String[] args) {
    String input = "it 's super cool";

    Matcher matcher = Pattern.compile("(?:^|\s)([A-Za-z] )").matcher(input);

    while (matcher.find()) {
        String result = matcher.group(1);
        System.out.println(result);
    }
}
  

Вывод:

 it
super
cool
  

Примечание: для сопоставления буквенных символов, букв на любом языке (например, хинди, немецком, китайском, английском и т. Д.) Используйте вместо этого следующее регулярное выражение:

 "(?:^|\s)(\p{L} )"
  

Подробнее о классе Pattern и классах для сценариев Unicode, блоков, категорий и двоичных свойств можно найти здесь .

Комментарии:

1. Этот ответ может быть неполным, в зависимости от того, что подразумевается под «токеном». Что отличает токен от другого? Только токены, состоящие ТОЛЬКО из букв, будут распознаны как один. Токен «doppler-effect» даст только «doppler» и полностью отбросит «effect».

2. [A-Za-z] работает только для английских алфавитов. Чтобы охватить все типы букв (например, хинди, немецкий, китайский и т.д.), Вы должны использовать \p{L} в Java.

3. Спасибо за информацию! Я этого не знал, поскольку я никогда не пробовал регулярные выражения за пределами английского алфавита. Я добавлю эту информацию. Спасибо, Арвинд!

Ответ №2:

Вы можете использовать (?<!\p{Punct})(\p{L} ) , что означает, что буквам не предшествует знак препинания. Обратите внимание, что (?<! используется для указания отрицательного взгляда. Проверьте документацию Pattern, чтобы узнать больше об этом.

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

public class Main {
    public static void main(String[] args) {
        String str = "it 's super cool";
        Pattern pattern = Pattern.compile("(?<!\p{Punct})(\p{L} )");
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}
  

Вывод:

 it
super
cool