2016-02-15 2 views
2

Я пытаюсь создать шаблон регулярного выражения, где я могу определить, заканчивается ли строка символом 's'. Я хочу удалить «s» из конца строки, но theres catch ...Regex pattern для определения s как последнего символа после гласного

Я хочу удалить 's', если и только если предыдущая часть слова содержит гласную НЕ НЕМЕДЛЕННО до 's', и слово не содержит другого гласного.

Так, например, слово «продажи» станет «продажей», потому что перед символом «e», предшествующим «s», в конце слова есть гласная.

Слово «примеры» -> «пример»

НО слово «газ» должен оставаться газ, потому что единственный гласный является один непосредственно перед «с».

я придумал следующее:

public String removeS(String word) { 
     if (word.matches(".*[a|e|i|o|u][.*]s")){ 
      word = word.substring(0, word.length()-1); 
     } 
     return word; 
} 

Теперь, когда я ввод слова, как «продаж», ничего не происходит. Это просто слово «продажи». Я предполагаю, что это имеет какое-то отношение к шаблону regex, который я использую, чтобы соответствовать строке.

Я относительно новичок в регулярном выражении, но то, что я пытался получить с этим ".*[a|e|i|o|u][.*]s", - это то, что я объяснил выше. Сопоставьте строку, имеющую некоторый гласный (a, e, i, o, u) перед символом непосредственно перед s в конце строки. Я что-то пропустил?

+0

'. * [Aeiou].* s' может быть лучше. –

+0

Как сказал anndy; но я до сих пор не понимаю этого условия: «Я хочу удалить« s »тогда и только тогда, когда предыдущая часть слова содержит гласную НЕ НЕМЕДЛЕННО перед« s » – Enissay

+0

Что-то вроде' [^ aeiou]. + [aeiou] s'? – Tunaki

ответ

4

Я хотел бы предложить вам не попробовать это, потому что ваш список исключений будет расти, и расти, и расти, и расти, и расти, и расти, ...

Например, работа stress получите последние s удалены, следуя вашим правилам.

Во всяком случае, здесь это расширенная версия, которая также держать двойной s нетронутыми:

str.replaceAll("(?i)([aeiou][a-z]*[a-rt-z])s\\b", "$1") 

See regex101 for result. Обратите внимание, как stress и has остались в покое.

Также обратите внимание, как wishes становится wishe, что неправильно. Английское написание слишком сложно для простых правил, подобных этому.

Oohhh Мне нравится схема железной дороги, которую подарила Энди Тернер. Here it is for this regex.

+0

Это работает отлично. Я использовал это как часть другого метода, где я делал чек для случаев SS, но это работает намного лучше. не могли бы вы объяснить регулярное выражение, которое вы использовали? – Anderology

+0

И «города», «ножи». – saka1029

+0

@Anderology Нажмите ссылку для regex101. У верхнего права есть объяснение. Это достаточно хорошо? – Andreas

1

Теперь, я не знаю, что вы детали вашего случая использования только информация, но это должно работать:

public String removeS(String word) { 
    if (word.matches(".*[aeiou].+[aeiou]s")){ 
     word = word.substring(0, word.length()-1); 
    } 

    return word; 
} 

Это соответствует «ноль или более символов», а затем «гласный» , а затем «один или несколько символов», за которым следует «другой гласный», а затем «s».

Вы можете визуализировать этот here.

Обратите внимание, что для этого требуется наличие хотя бы одной буквы между двумя гласными. Если вы хотите, чтобы sees стал see, также измените .+ на другой .*, например this.

+0

Конечно. Они будут съедены '. *'/'. +'. – Will

Смежные вопросы