正则表达式从字符串中删除元音,但第一个和最后一个字符除外

本文关键字:第一个 最后一个 字符 字符串 删除 正则表达式 | 更新日期: 2023-09-27 18:36:31

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

例如

原始字符串 -- 源 = apeaple

在正则表达式之后 -- source_modified = 苹果(这是预期的)

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

使用的代码 --

Regex reg = new Regex("([a-zA-Z])[aeiouAEIOU]([a-zA-Z])");字符串 source_modified = 注册。替换(源,");

原始字符串 -- 源 = apeaple

代码执行后 -- source_modified = aple(删除重复字符)

使用的代码 -- string source_modified = Regex.Replace(source, "([a-zA-Z])[aeiouAEIOU]([a-zA-Z])", "$1" + "$2");

原始字符串 -- 源 = apeaple

代码执行后 -- source_modified = apaple(仅删除 1 个元音)

我也尝试了([a-zA-Z])[aeiouAEIOU]*([a-zA-Z])但这只删除了 1 个元音,而不是全部。所以当我应用上面的表达式时,会发生以下情况

使用的代码 --

Regex reg = new Regex("([a-zA-Z])[aeiouAEIOU]*([a-zA-Z])");字符串 source_modified = 注册。替换(源,");

原始字符串 -- 源 = apeaple

代码执行后 -- source_modified = " (删除所有字符)

使用的代码 -- string source_modified = Regex.Replace(source, "([a-zA-Z])[aeiouAEIOU]*([a-zA-Z])", "$1" + "$2");

原始字符串 -- 源 = apeaple

代码执行后 -- source_modified = apeple

正则表达式从字符串中删除元音,但第一个和最后一个字符除外

你需要像这样环顾四周

(?<!^)[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 是一个辅音(呃......有没有这样的词),因此不应该消失,因为 y 也必须列在最后一个字符类中:

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

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

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

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();

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

(.+)[aeiouAEIOU](.+)
如果您想

将其应用于由多个单词组成的字符串中的单个单词,'B[AEIOUaeiou]'B可能值得一试。 'B是非单词边界,即两个相邻字符都是单词字符或两个非单词字符的任何位置。如果两个位置之间存在元音,则后一种情况显然是不可能的。

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

相关文章: