2

C# で文字列をフォーマットしようとしていますが、基本的にモデル名が md234GH と Dgh321Hh の場合、正規表現などを使用する必要があるかどうかわかりません。MD234gh と DGH321hh である必要があります。

したがって、大文字の数字は小文字です

私は次のことを試しました:

TextInfo textInfo = new CultureInfo("en-GB", false).TextInfo;

foreach (var product in products)
{
    if (product.ModelName != null)
    {
        product.ModelName = product.ModelName.ToLower();
        product.ModelName = textInfo.ToTitleCase(product.ModelName);
    }
}

しかし、これは最初の文字を大文字にするだけです。

アドバイスをいただければ幸いです

4

6 に答える 6

2

ToTitleCase各単語の最初の文字を大文字にすることだけを意味します。.ToUpper必要なことを行うには、文字列を分割して呼び出し、必要に応じて呼び出す必要があります。次に.ToLower例を示します。

Regex modelExpression = new Regex("^([A-Za-z]+)([0-9]+)([A-Za-z]+)$");

// Inside for loop...
Match m = modelExpression.Match(product.ModelName);
if (m.Success)
{
    product.ModelName = m.Groups[1].Value.ToUpper() 
         + m.Groups[2].Value 
         + m.Groups[3].Value.ToLower();
}
于 2012-06-11T11:42:57.227 に答える
1

ToTitleCase各単語の最初の文字のみを大文字にします。

ToUpperすべての文字を大文字にするために使用する必要があります。

やりたいことをするために組み込まれているものは何もないので、自分で作成する必要があります。数字の間の文字列を解析し、各部分をフォーマットします。

正規表現は最善の策のように見えます。

^([A-Za-z]+)([0-9]+)([A-Za-z]+)$

使用法:

var formatted = Regex.Replace(originalString,
                          @"^([A-Za-z]+)([0-9]+)([A-Za-z]+)$",
                          m => m.Groups[1].Value.ToUpper() +
                          m.Groups[2].Value +
                          m.Groups[3].Value.ToLower());

「md234GH」の結果は「MD234gh」であり、「Dgh321Hh」の結果は「DGH321hh」です。

于 2012-06-11T11:41:03.573 に答える
1

正規表現を使用できます:

(?i)^([a-z]+)(\d+)([a-z]+)$

置換では、次のようになります。

model = Regex.Replace(model, @"(?i)^([a-z]+)(\d+)([a-z]+)$", delegate(Match m)
{
    return m.Groups[1].Value.ToUpper() + m.Groups[2].Value + m.Groups[3].Value.ToLower();
});
于 2012-06-11T11:48:13.327 に答える
0

これはプレーン C での解決策です。これは、8 ビット ASCII または ANSI 文字セットが使用されていることを前提としています。

void convertModelName(char *name)
{
    char    *ptr;
    int     lcase = 0;

    for (ptr=name; *ptr; ptr++) {
        if (*ptr >= '0' && *ptr <= '9') {
            lcase = 1;
        } else {
            if (lcase) {
                *ptr |= 0x20;
            } else {
                *ptr &= 0xdf;
            }
        }
    }
}
于 2012-06-11T12:25:45.950 に答える
0

正規表現はこれに適しています。

\b(\D+)(\d+)(\D+)\b

必要なのは、C# で正規表現 API を使用し、置換を行うデリゲートを与えることだけです。デリゲートとしてラムダを使用しました:

var result = Regex.Replace("md234GH", @"\b(\D+)(\d+)(\D+)\b", x =>
    x.Groups[1].Value.ToUpper() 
    + x.Groups[2].Value 
    + x.Groups[3].Value.ToUpper() 
);
于 2012-06-11T11:43:20.243 に答える
0
using System.Text.RegularExpressions;

Match m=Regex.Match("md234GH","(\\w+?)(\\d+)(\\w+)");
Console.WriteLine("{0}{1}{2}",m.Groups[1].Value.ToUpper(),m.Groups[2].Value,m.Groups[3].Value.ToLower());
于 2012-06-11T11:47:28.650 に答える