RegEx为具有混合数字和字母的任何单词设置标题案例然后大写

时间:2012-12-04 16:08:51

标签: c# regex

给出以下示例字符串:

PP12111 LOREM IPSUM TM ENCORE
LOREM PP12111 IPSUM TM ENCORE
LOREM IPSUM ENCORE TM PP12111
LOREM PP12111 PP12111 TM ENCORE

.NET RegEx用于设置标题大小写,然后将包含数字和字母的任何字符串转换为大写字母(请参阅下面的注释):

PP12111 Lorem Ipsum TM Encore
Lorem PP12111 Ipsum TM Encore
Lorem Ipsum Encore TM PP12111
Lorem PP12111 PP12111 TM Encore

Alternativley,我可以从设置为Title Case的所有内容开始,因此只需要将包含数字和字母的字符串设置为大写:

Pp12111 Lorem Ipsum TM Encore
Lorem Pp12111 Ipsum TM Encore
Lorem Ipsum Encore TM Pp12111
Lorem Pp12111 Pp12111 TM Encore

注意:如果TM的任何变体存在(tm,Tm,tM),它应该是完整的大写。 TM可以是“lorem ipsum TM valor”或“lorem ipsum(TM)valor”。

这是一个有效的纯字符串操作方法;我认为RegEx解决方案可能更合适吗?

private static void Main( string[] args )
{
    var phrases = new[]
        {
          "PP12111 LOREM IPSUM TM ENCORE", "LOREM PP12111 IPSUM TM ENCORE",
          "LOREM IPSUM ENCORE TM PP12111", "LOREM PP12111 PP12111 TM ENCORE",
        };

    Test(phrases);
}

private static void Test( IList<string> phrases )
{
    var ti = Thread.CurrentThread.CurrentCulture.TextInfo;

    for( int i = 0; i < phrases.Count; i++ )
    {
        string p = ti.ToTitleCase( phrases[i].ToLower() );
        string[] words = p.Split( ' ' );

        for( int j = 0; j < words.Length; j++ )
        {
            string word = words[j];
            if( word.ToCharArray().Any( Char.IsNumber ) )
            {
                word = word.ToUpper();
            }
            words[j] = word.Replace( " Tm ", " TM " ).Replace( "(Tm)", "(TM)" );
        }

        phrases[i] = string.Join( " ", words );

        Console.WriteLine( phrases[i] );
    }
}

3 个答案:

答案 0 :(得分:3)

您可以像这样使用此正则表达式:

MatchEvaluator evaluator = m => ti.ToTitleCase(m.Value.ToLower());
string result = Regex.Replace(input, @"\b(?!TM\b)[A-Z']+\b", evaluator,
                              RegexOptions.IgnoreCase);

\b是一个单词边界 pos(?!suffix)匹配位置不在后缀之前。
\b(?!TM\b)字边界不在TM之前 [A-Z]+没有数字的单词。

Together:字边界不在“TM”之前,后跟字母A到Z和字边界。


更新#1

上壳“tm”,“Tm”,“tM”:

我不知道所有没有大写的东西是否都是大写的。在这种情况下,最简单的解决方案是输入大写:input.ToUpper()。否则执行第二个正则表达式替换:

string result = Regex.Replace(result, @"\btm\b", "TM", RegexOptions.IgnoreCase);

更新#2

如果你想要大写几个单词,你可以使用另一个匹配评估器:

MatchEvaluator toUpperCase = m => m.Value.ToUpper();
string result = Regex.Replace(result, @"\b(tm|xxx|yyy)\b", toUpperCase,
                              RegexOptions.IgnoreCase);

tm|xxx|yyy指定要加上大写的单词(“tm”,“xxx”或“yyy”)。

答案 1 :(得分:0)

以下是您之前要求的近距离比赛评论:Regular Expression Uppercase Replacement in C#。这里的正则表达式是不够的,你必须编写一个MatchEvaluator函数来将所有东西都变成大写。

编辑:看到“注意:如果TM的任何变体存在(tm,Tm,tM),它应该是完全大写的。其中TM可以是”lorem ipsum TM valor“或”lorem ipsum(TM)valor “”让我觉得你应该完全停止考虑一个正则表达式。怎么样前。 oa tm eal,眩晕 tm en等等,等等。

是的,您可能会编写一个可以找到所有案例的正则表达式,或者一个考虑您的逻辑的良好而彻底的matchevaluator。但是,你用可以让我认为你不熟悉正则表达式的术语来描述这个问题。因此,我很难认为这对你来说是一个很好的答案,而且是一个“坚固”的解决方案,而不是任何应该投入生产的解决方案。

答案 2 :(得分:-1)

第一名:LowerCase Everything。

第二:将句子分成单词。

对于每个单词:

检查,如果只有两个字母或字母和数字([a-z]{2}|[a-z0-9]{2,})

匹配 - &gt; UpperCase吧。

不匹配 - &gt; TitleCase它。