1

给定以下示例字符串:

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] );
    }
}
4

3 回答 3

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]+

一起:单词边界不在“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”)。

于 2012-12-04T16:53:05.667 回答
0

这是之前要求您查看的紧密匹配项:C# 中的正则表达式大写替换。一个正则表达式在这里是不够的,你必须编写一个 MatchEvaluator 函数来把所有的东西都变成大写。

编辑:看到“注意:如果存在 TM 的任何变体(tm,Tm,tM),它应该是完整的大写。其中 TM 可以是“lorem ipsum TM valor”或“lorem ipsum (TM) valor”。让我认为您应该完全停止考虑正则表达式。前任呢。oa tm al, stun tm en or etc, etc, etc.

是的,您可能可以编写一个可以找到所有情况的正则表达式,或者一个将您的逻辑考虑在内的良好而彻底的匹配评估器。但是,您用使我认为您不熟悉正则表达式的术语来描述问题。因此,我很难认为这对您来说是一个很好的答案,并且将是一个“矮小的”解决方案,而不是任何应该投入生产的解决方案。

于 2012-12-04T16:29:31.313 回答
-1

第一:小写一切。

第二:把句子分成单词。

对于每个单词:

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

匹配 -> 大写。

No Match-> TitleCase 吧。

于 2012-12-04T16:18:20.190 回答