簡體   English   中英

c# - 正則表達式從字符串中刪除元音,除了第一個和最后一個字符

[英]c# - regex to remove vowels from string except first and last character

我試圖從字符串中刪除除第一個和最后一個字符之外的所有元音。 我試過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

如果是這樣,為什么不刪除第一個和最后一個字符,刪除元音,然后再次縫合?

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

你需要一些看起來像這樣

(?<!^)[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是一個輔音(euh ......是否有這樣一個單詞)因此不應該消失,因為ay必須也列在最后一個字符類中:

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

我再說一遍,我使用C#作為我的正則表達方言,它對外觀技術有很好的支持。

你需要用至少一個字符開始字符串,找到一個元音,然后用至少一個字符結束字符串。 嘗試:

(.+)[aeiouAEIOU](.+)

如果您想將其應用於包含多個單詞的字符串中的單個單詞, \\B[AEIOUaeiou]\\B可能值得一試。 \\B是非字邊界,即兩個相鄰字符既是字字符又是非字字符的任何位置。 如果兩個位置之間有一個元音,那么后一種情況顯然是不可能的。

不用說它也適用於僅包含單個單詞的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM