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

时间:2012-06-06 14:10:09

标签: c# .net regex

我正在尝试从字符串中删除除第一个和最后一个字符之外的所有元音。我试过2个表达式并使用2种方法但是徒劳无功。我在下面描述了它们。有人有正则表达式吗?

e.g。

原始字符串 - 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

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分:6)

你需要一些像这样的外观

(?<!^)[aouieyAOUIEY](?!$)

C#支持它,它非常强大

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]))(?!$)

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

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

(?<!^)([aouie]|y(?![aouiey]))(?!$)

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

答案 2 :(得分:0)

你需要用至少一个字符开始字符串,找到一个元音,然后用至少一个字符结束字符串。尝试:

(.+)[aeiouAEIOU](.+)

答案 3 :(得分:0)

如果您想将其应用于包含多个单词的字符串中的单个单词,\B[AEIOUaeiou]\B可能值得一试。 \B是非单词边界,即两个相邻字符既是单词字符又是非单词字符的任何位置。如果两个位置之间有一个元音,那么后一种情况显然是不可能的。

毋庸置疑,它也适用于仅包含单个单词的字符串。