#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