Извлечение строки без последнего символа, если гласная

#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, отредактировал мой ответ, чтобы соответствовать целым словам, которые могут быть в строке!