3

最初と最後の文字を除いて、文字列からすべての母音を削除しようとしています。2 つの式と 2 つの方法を使用してみましたが、無駄でした。以下にそれらを説明しました。誰かがこれの正規表現を持っていますか?

例えば

元の文字列 -- source = apeaple

正規表現の後 -- 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 は、英語には特別な規則があることを知らせてくれました (「これは、内側の 'y' が子音として使用される "Anyanka" のような単語には機能しません」)。

次の変更は、否定先読みの手法を使用してこれを行う必要があります。

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

今回は、大文字と小文字を区別しない正規表現修飾子を有効にします。これにより、元の正規表現よりも単純になります。

ay の後に別の y が続く場合でも、y が子音であることを意味し (うーん...そのような単語はありますか)、したがって、y が最後の文字クラスにもリストされている必要があるため、消えてはなりません。

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

ルックアラウンド手法を適切にサポートする正規表現方言として C# を使用したことを繰り返します。

于 2012-06-06T14:19:03.220 に答える
0

少なくとも 1 文字で文字列を開始し、母音を見つけてから、少なくとも 1 文字で文字列を終了する必要があります。試す:

(.+)[aeiouAEIOU](.+)
于 2012-06-06T14:21:21.007 に答える