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

正则表达式是一个很好的匹配:

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

现在所需要做的就是在 C# 中使用正则表达式 api 并给它一个执行替换的委托。我使用 lambda 作为委托:

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 回答
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 回答