首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegEx设置标题大小写,然后为任何具有混合数字和字母的单词设置大写

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

Stack Overflow用户
提问于 2012-12-04 16:08:50
回答 3查看 3.1K关注 0票数 1

给定以下示例字符串:

代码语言:javascript
复制
PP12111 LOREM IPSUM TM ENCORE
LOREM PP12111 IPSUM TM ENCORE
LOREM IPSUM ENCORE TM PP12111
LOREM PP12111 PP12111 TM ENCORE

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

代码语言:javascript
复制
PP12111 Lorem Ipsum TM Encore
Lorem PP12111 Ipsum TM Encore
Lorem Ipsum Encore TM PP12111
Lorem PP12111 PP12111 TM Encore

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

代码语言:javascript
复制
Pp12111 Lorem Ipsum TM Encore
Lorem Pp12111 Ipsum TM Encore
Lorem Ipsum Encore TM Pp12111
Lorem Pp12111 Pp12111 TM Encore

备注:如果存在TM的任何变体(tm,Tm,tM),则它应该是完整的大写。其中商标可以是"lorem ipsum商标英勇“或"lorem ipsum (商标)勇敢”。

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

代码语言:javascript
复制
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] );
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-04 16:53:05

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

代码语言:javascript
复制
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)的准准性

[A-Z]+

合并:单词边界,而不是在"TM“前面加上字母A到Z和单词边界的单词。

更新#1

上套管"tm","Tm","tM":

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

代码语言:javascript
复制
string result = Regex.Replace(result, @"\btm\b", "TM", RegexOptions.IgnoreCase);

更新#2

如果要大写几个单词,只需使用另一个匹配计算器:

代码语言:javascript
复制
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")。

票数 3
EN

Stack Overflow用户

发布于 2012-12-04 16:29:31

这里有一个先前询问过的密切匹配,供您查看:Regular Expression Uppercase Replacement in C#。在这里,正则表达式是不够的,您必须编写一个MatchEvaluator函数才能将所有内容都变成大写。

编辑:见“注意:如果存在任何TM的变体( TM,Tm,tM),则它应该是完整的大写。如果TM可以是"lorem ipsum TM valor”或"lorem ipsum (TM) valor“。”让我觉得你不应该再考虑判决了。那前男友呢。oatm_eal,眩晕tm_en等。

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

票数 0
EN

Stack Overflow用户

发布于 2012-12-04 16:18:20

首先: LowerCase所有的东西。

第二,把句子分成几个字。

每一个词:

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

匹配-> UpperCase it。

不匹配-> TitleCase它.

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13707046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档