3

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

例如

原始字符串 -- source = apeaple

在 regex -- source_modified = apple 之后(这是预期的)

我尝试了这个表达式,([a-zA-Z])[aeiouAEIOU]([a-zA-Z])但这个表达式也删除了重复的字符。所以当我应用上述表达式时会发生以下情况

使用的代码——

正则表达式 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 个元音,而不是全部。所以当我应用上述表达式时会发生以下情况

使用的代码——

正则表达式 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

4 回答 4

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();
于 2012-06-06T14:18:06.933 回答
7

你需要像这样的环顾四周

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

C# 支持它并且非常强大

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

更新 1

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

以下更改应该使用负前瞻技术来做到这一点:

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

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

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

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

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

于 2012-06-06T14:19:03.220 回答
0

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

(.+)[aeiouAEIOU](.+)
于 2012-06-06T14:21:21.007 回答
0

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

不用说,它也适用于仅由单个单词组成的字符串。

于 2012-06-06T16:30:08.267 回答