c# - 正则表达式从字符串中删除元音,除了第一个和最后一个字符

sam*_*mar 2 .net c# regex

我试图从字符串中删除除第一个和最后一个字符之外的所有元音.我试过2个表达式并使用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

Sha*_*hai 7

如果是这样,为什么不删除第一个和最后一个字符,删除元音,然后再次缝合?

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();
Run Code Online (Sandbox Code Playgroud)


buc*_*ley 6

你需要一些看起来像这样

(?<!^)[aouieyAOUIEY](?!$)
Run Code Online (Sandbox Code Playgroud)

C#支持它,它非常强大

string resultString = null;
try {
    resultString = Regex.Replace(subjectString, "(?<!^)[aeui](?!$)", "");
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}
Run Code Online (Sandbox Code Playgroud)

更新1

TWRCole告诉我英语中有一条特殊的规则("这对于像"Anyanka"这样的单词不起作用,其中内部'y'用作辅音")

以下更改应使用负前瞻技术执行此操作:

(?<!^)([aouie]|y(?![aouie]))(?!$)
Run Code Online (Sandbox Code Playgroud)

这次启用匹配不区分大小写的正则表达式修饰符,它使正则表达式比原始更简单

如果ay后跟另一个y仍然意味着y是一个辅音(euh ......是否有这样一个单词)因此不应该消失,因为ay必须也列在最后一个字符类中:

(?<!^)([aouie]|y(?![aouiey]))(?!$)
Run Code Online (Sandbox Code Playgroud)

我再说一遍,我使用C#作为我的正则表达方言,它对外观技术有很好的支持.