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

または、すべてを 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」の場合があります。

これは、機能する純粋な文字列操作方法です。正規表現ソリューションの方が適していると思いますか?

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(). それ以外の場合は、2 番目の正規表現の置換を実行します。

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は「loremipsumTMvalor」または「loremipsum(TM)valor」の場合があります。」を参照してください。正規表現の検討を完全にやめるべきだと思います。例はどうですか。oa tm eal、stuntmenなどなど。

はい、おそらく、すべてのケースを見つける1つの正規表現、またはロジックを考慮に入れた優れた徹底的なマッチエバリュエーターを作成できます。ただし、正規表現に慣れていないように思わせるような言葉で問題を説明しています。ですから、これがあなたにとって良い答えであり、本番環境に移行する必要のあるものではなく、「気の利いた」解決策になるとは思えません。

于 2012-12-04T16:29:31.313 に答える
-1

最初: すべてを小文字にします。

2 番目: 文を単語に分割します。

各単語について:

文字が 2 つだけか、文字と数字かを確認します([a-z]{2}|[a-z0-9]{2,})

一致 -> 大文字にします。

No Match -> TitleCase です。

于 2012-12-04T16:18:20.190 に答える