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