给出以下示例字符串:
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] );
}
}
答案 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它。