Вопрос:
Я пытаюсь удалить все гласные из строки, за исключением первого и последнего символов. Я пробовал с двумя выражениями и использовал 2 пути, но напрасно. Я описал их ниже. У кого-то есть регулярное выражение для этого?
например.
исходная строка – source = apeaple
после regex – source_modified = apple (это то, что ожидается)
Я попробовал выражение ([a-zA-Z])[aeiouAEIOU]([a-zA-Z]), но это выражение также удаляет повторяющийся символ. Поэтому, когда я применяю вышеприведенное выражение
происходит следующее:
используемый код –
Regex reg = new Regex(«([a-zA-Z])[aeiouAEIOU]([a-zA-Z])»); string source_modified = reg.Replace(source, «»);
исходная строка – source = apeaple
после выполнения кода – source_modified = aple (повторяющийся символ удален)
используемый код – string source_modified = Regex.Replace(source, «([a-zA-Z])[aeiouAEIOU]([a-zA-Z])», «$1» + «$2»);
исходная строка – source = apeaple
после выполнения кода – source_modified = apaple (удаляется только 1 гласная)
Я также пробовал ([a-zA-Z])[aeiouAEIOU]*([a-zA-Z]), но это удаление только 1 гласной и не всех. Поэтому, когда я применяю вышеприведенное выражение
происходит следующее:
используемый код –
Regex reg = new Regex(«([a-zA-Z])[aeiouAEIOU]*([a-zA-Z])»); string source_modified = reg.Replace(source, «»);
исходная строка – source = apeaple
после выполнения кода – source_modified = “” (все символы удалены)
используемый код – string source_modified = Regex.Replace(source, «([a-zA-Z])[aeiouAEIOU]*([a-zA-Z])», «$1» + «$2»);
исходная строка – source = apeaple
после выполнения кода – source_modified = apeple
Пожалуйста, помогите! Спасибо заранее!
Привет,
Самар
Лучший ответ:
Вам нужно немного выглядеть так
(?<!^)[aouieyAOUIEY](?!$)
С# поддерживает его, и он очень мощный
string resultString = null; try { resultString = Regex.Replace(subjectString, «(?<!^)[aeui](?!$)», «»); } catch (ArgumentException ex) { // Syntax error in the regular expression }
Обновление 1
T.W.R.Cole сообщает мне, что на английском языке существует специальное правило ( “это не работает для слов типа” Anyanka “, где внутренний” y “используется как согласный)
Следующее изменение должно сделать это, используя технику отрицательного просмотра:
(?<!^)([aouie]|y(?![aouie]))(?!$)
На этот раз включите модификатор regex, который нечувствителен к регистру, он делает регулярное выражение более простым, чем исходный
если a y, за которым следует другой y, все еще означает, что y является согласным (euh… есть такое слово) и, следовательно, не должен исчезать, поскольку y должен быть указан и в последнем классе символов:
(?<!^)([aouie]|y(?![aouiey]))(?!$)
Я повторяю, что я использовал С# как мой диалект regex, который имеет хорошую поддержку поисковых методов.
Ответ №1
Если да, почему бы не удалить 1-й и последний символы, удалить гласные, а затем снова вставить?
string sWord = «apeaple»; char cFirst = sWord[0], cLast = sWord[sWord.length-1]; sWord = sWord.substring(1, sWord.length -2); sWord = cFirst.ToString() + Regex.Replace(sWord , «[aouiyeAOUIYE]», String.Empty) + cLast.ToString(); Ответ №2
Вам нужно запустить строку с хотя бы одним символом, найти гласный, а затем закончить строку с хотя бы одним символом. Попробуйте:
(.+)[aeiouAEIOU](.+) Ответ №3
Если вы когда-либо захотите применить это к отдельным словам в строках, которые состоят из более чем одного слова, B[AEIOUaeiou]B может стоить попробовать. B является границей без слов, то есть любым местом, где два соседних символа являются либо символами слова, либо двумя символами без слова. Последний случай, очевидно, невозможен, если между двумя местоположениями имеется гласная.
Излишне говорить, что это также работает для строк, состоящих только из одного слова.