#java #regex
#java #регулярное выражение
Вопрос:
С помощью регулярных выражений, как я могу извлечь все слово, кроме последнего символа, если это гласная?
Входные данные:
ansia
bello
ansid
Ожидаемый результат для каждого:
ansi
bell
ansid
Это то, что я пробовал, но это работает, только если у меня есть одна гласная в конце:
^(.*[^aeiou])
Комментарии:
1. А как насчет
^(.*?)[aeiou]?$
?2. Почему бы просто не проверить, если
listOfVowels.contains(myString.charAt(myString.length()-1))
и взять подстроку, если это необходимо?3. Я должен использовать регулярное выражение в улье
4. @user3753950: Просто для уточнения: вы хотите извлечь все слово без его последнего символа, если последний символ слова является гласной? И что вы хотите, чтобы произошло, когда последний символ не является гласной? Игнорировать это?
5. @AmalMurali да. Я хочу игнорировать это. если у меня есть
ansia
, я хочуansi
. Если у меня естьbello
, я хочуbell
. Если у меня естьansid
, я хочуansid
.
Ответ №1:
Аналогично тому, что написал @Sotirios Делиманолис в своем комментарии, но с использованием границ слов, чтобы это работало, если у вас несколько слов в строке.
b(w ?)[aeiou]?b
Это работает следующим образом :
1) b
соответствует началу слова. Это будет работать для первого слова в строке или слова, которому предшествует несловесный символ (символ слова — это любой буквенно-цифровой символ).
2) (w ?)
сопоставляет и фиксирует ту часть слова, которая вам интересна.
2a) w
соответствует любому символу слова.
2b)
делает w
сопоставление один или несколько раз
2c) ?
позволяет
сопоставить как можно меньше символов. Это важно, потому что, если в конце слова есть гласная, мы не хотим сопоставлять ее в группе захвата, а вместо этого пусть (3) позаботится об этом.
3) [aeiou]?
совпадает, но не захватывает гласный символ, если он присутствует
3a) [aeiou]
соответствует гласной
3b) ?
делает [aeiou]
сопоставление нулевым или одним разом
4) b
соответствует концу слова. Это будет работать для слова в конце строки или слова, за которым следует несловесный символ.
Вы сказали, что используемый вами инструмент использует реализацию регулярных выражений Java и ansid
не работает для вас с моим регулярным выражением. Я протестировал ее на чистой Java, и, похоже, она работает для меня:
Pattern pattern = Pattern.compile("\b(\w ?)[aeiou]?\b");
Matcher matcher = pattern.matcher("ansia ansid cake cat dog");
while (matcher.find()) {
System.out.println(matcher.group(1));
}
С принтами
ansi
ansid
cak
cat
dog
Комментарии:
1. Это не работает. Протестируйте его на debuggex
2. Это
ansid
тоже совпадает.3. @Braj да, для любого слова формы
[a-zA-Z0-9]*[^aeiou]
оно будет соответствовать всему слову, а также захватывать все слово целиком, для слова формы[a-zA-Z0-9]*[aeiou]
оно будет соответствовать всему слову, но захватывать только все, за вычетом последнего символа, о чем, я полагаю, спрашивал вопрос4. @Braj да, вы правы. Не работает. Ибо
ansid
я хочуansid
5. Пожалуйста, объясните Сэму также.
Ответ №2:
Попробуйте регулярное (b[a-zA-Z] ?(?=[aeiou]b))|(b[a-zA-Z] ?[^aeiou]b)
выражение. Это захватывает либо слово, оканчивающееся на согласную, ЛИБО слово, оканчивающееся на гласную, и опускает гласную в конце.
Комментарии:
1. Извините, неправильно понял ваш вопрос. Обновленный ответ.
Ответ №3:
этот шаблон сработал для меня
^(.*?)(?=[aeiou]$|$)
ДЕМОНСТРАЦИЯ
в случае, если вводятся слова, которые могут быть в строке, как указано ниже
, используйте этот шаблон
b([a-z] ?)(?=[aeiou]b|b)
ДЕМОНСТРАЦИЯ
Комментарии:
1. OP говорит о целых словах, которые могут быть в строке. Строка может содержать мои слова. В этом случае это не сработает, верно?
2. в Braj это было не очень понятно в запросе OP, отредактировал мой ответ, чтобы соответствовать целым словам, которые могут быть в строке!