Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RegEx设置标题大小写,然后为任何数字和字母混合的单词设置大写_C#_Regex - Fatal编程技术网

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

C# RegEx设置标题大小写,然后为任何数字和字母混合的单词设置大写,c#,regex,C#,Regex,给定以下示例字符串: PP12111 LOREM IPSUM TM ENCORE LOREM PP12111 IPSUM TM ENCORE LOREM IPSUM ENCORE TM PP12111 LOREM PP12111 PP12111 TM ENCORE 什么是.NET正则表达式,用于设置标题大小写,然后将包含数字和字母的字符串转换为大写(请参见下面的注释): Alternativley,我可以将所有内容都设置为标题大小写,因此只需将包含数字和字母的字符串设置为大写: Pp12111

给定以下示例字符串:

PP12111 LOREM IPSUM TM ENCORE
LOREM PP12111 IPSUM TM ENCORE
LOREM IPSUM ENCORE TM PP12111
LOREM PP12111 PP12111 TM ENCORE
什么是.NET正则表达式,用于设置标题大小写,然后将包含数字和字母的字符串转换为大写(请参见下面的注释):

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

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”

这是一个纯字符串操作方法,可以工作;我认为正则表达式解决方案可能更合适

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] );
    }
}
private static void Main(字符串[]args)
{
变量短语=新[]
{
“PP12111 LOREM IPSUM TM ENCORE”、“LOREM PP12111 IPSUM TM ENCORE”,
“LOREM IPSUM ENCORE TM PP12111”、“LOREM PP12111 PP12111 TM ENCORE”,
};
测试(短语);
}
专用静态空隙试验(ILST)
{
var ti=Thread.CurrentThread.CurrentCulture.TextInfo;
for(int i=0;i
首先:所有内容都小写

第二:把句子分成单词

对于每个单词:

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

匹配->大写


无匹配->标题将其存档。

这里有一个先前要求的接近匹配,供您查看:。正则表达式在这里是不够的,您必须编写一个MatchEvaluator函数来将所有内容转换为大写

编辑:看到“注意:如果存在TM的任何变体(TM,TM,TM),它应该是完全大写的。其中TM可以是“lorem ipsum TM valor”或“lorem ipsum(TM)valor”。“这让我觉得你应该完全停止考虑正则表达式。”。例如oatmeal、stuntmen或etc等


是的,您可能可以编写一个正则表达式来查找所有案例,或者编写一个好的、彻底的匹配计算器来考虑您的逻辑。但是,您描述问题的术语让我觉得您不熟悉正则表达式。所以我很难认为这是一个好的答案,是一个“特技”解决方案,而不是任何应该投入生产的东西

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

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”)

你不能单独使用正则表达式。您仍然需要一个回调函数来处理案例的更改。查看
Regex.Replace
@m.buettner-感谢您的链接;我会回顾一下,希望它能让我更好地理解。两次改变这个案例的目的是什么?初始大小写与最终结果是否为大写或标题大小写无关。你是对的,但别忘了扩展匹配组或使正则表达式不区分大小写。这个想法有一个问题。根据提议的规则,of、we和us都将转换为大写。这是一项令人印象深刻的工作,但无法在“TM”的变体上格式化:“LOREM IPSUM ENCORE TM PP12111”、“LOREM IPSUM ENCORE TM PP12111”等。我想您可以将Regex.Replace(输入[…])更改为Regex.Replace(输入.touper[…])。看起来你会徒劳地在很多单词上切换大小写,只是为了抓住例外。也许只是为了“TM”的第二个?但这同样不雅观。太棒了!比我的字符串操作干净得多,效果非常好。我已经浏览了我们大约7000个项目的目录,粗略的扫描看起来一切都按照预期的格式。更新中的一个问题:可能还有其他一次性词语需要替换;你能把几个Regex.Replaces串在一起吗?看起来有一个带收缩的边格:即,
收缩没有正确的标题格
变成
收缩没有正确的标题格
我刚刚在
[a-Z']中添加了一个
'
+
以考虑类似于
的情况,并添加了一个更新以将上框扩展到更多单词。这很有意义。感谢您的努力,正则表达式甚至是可读的。谢谢显然我不熟悉正则表达式:)。奥利维尔的回答很好地把事情安排好了。注意到对燕麦等食品的担忧。但是,TM永远是一个单独的词或括号内的词。Oliver的答案是最高级的,我很高兴看到你接受了它:)如果你对正则表达式感兴趣,请查阅黄金标准书《掌握正则表达式》
MatchEvaluator toUpperCase = m => m.Value.ToUpper();
string result = Regex.Replace(result, @"\b(tm|xxx|yyy)\b", toUpperCase,
                              RegexOptions.IgnoreCase);