LotosLabo

プログラミング技術とか気になった情報を載せていきます

【C#】文頭に句読点などの記号が来た時に文頭に来ないように調整する

前にこのような処理を作っていたので、公開します。

具体例

改行するような文字列があり、先頭に「、」や「。」などの句読点が来てほしくない時があります。

例:
おはようございます
。今日も元気にがんばりましょう



そのようなときにこんな感じに文頭の文字列を、文末へ持っていき修正します。

例:
おはようございます。
今日も元気にがんばりましょう!

プログラム

/*!
 * 先頭に句読点などの記号が来ないように調整するクラス.
 * 
 * @file	FirstStringCheck.cs
 * @author	Lotos
 * @date	2015-1-25 4:21
 */

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class FirstStringCheck : MonoBehaviour {

    /// <summary>
    /// 先頭に句読点などの記号が来ないように調整する.
    /// </summary>
    /// <param name="lineCount">最大表示行数.</param>
    /// <param name="text">文字列.</param>
    /// <returns>変換された文字列.</returns>
    public static string CheckText(int maxLineCount, string text) {
        string result = string.Empty;
        // 最大行数から一文字少なく表示.
        int lineCount = maxLineCount - 1;

        //  先頭に来てはいけない文字.
        string checkString = "、,.。」・};?!!?]";
        List<string> textList = new List<string>();

        // 全体文字数が最大行数を超えるとき.
        if (text.Length > lineCount) {
            // 全体文字数まで増やす.
            for (int index = 0; index < text.Length; index += lineCount) {
                // 全体文字数から最大行数分抜き出せた時.
                if (index < text.Length - lineCount) {
                    // 最大行数より一文字多く抜き取る.
                    string lineCountPlusText = text.Substring(index, lineCount + 1);
                    // 最大行数分抜き取る.
                    string lineCountText = text.Substring(index, lineCount);
                    // 一文字多く取得した文字列の一番最初の文字を取得.
                    string firstText = lineCountPlusText.Substring(lineCount, 1);
                    // 抜き出した文字が先頭に来てはいけない文字か判断.
                    if (0 <= checkString.IndexOf(firstText)) {
                        // 一文字多くリストに追加.
                        textList.Add(lineCountPlusText);
                        // 一文字多く取得したので、1追加.
                        index += 1;
                    } else {
                        // 最大行数分リストに追加.
                        textList.Add(lineCountText);
                    }
                } else {
                    // 残り文字数を取得.
                    int remainingTextCount = text.Length - index;
                    // 残り文字数を抜き出す.
                    string remainingText = text.Substring(index, remainingTextCount);
                    textList.Add(remainingText);
                }
            }
           for (int index = 0; index < textList.Count; ++index) {
            result += textList[index] + "\n";
           }
           return result;
        }
        return text; 
    }
}

使い方

例としてこれをUnity上で表示させてみます。

最大で表示してもいい行数(今回は5行)と、テキストを渡します。

 void Start() {
        string sampleText = "おはよう、今日も1日、がんばるぞい!";
        var result = FirstStringCheck.CheckText(5, sampleText);
        Debug.Log(result);
    }

テキストが5行もしくは4行ずつで改行して表示されます。
文頭に句読点などが来る場合は5行、それ以外は4行になります。


f:id:lo25131:20151109002154j:plain


現在は文頭に来てほしくない文字を
string checkString = "、,.。」・};?!!?]";
で指定してますが、もっと来てほしくない文字があれば、これに追加する形で
文頭に来なくなります。

最後に

約一年前に作った処理なので、もしかしたらもっと簡単な方法でチェックでき、
短いプログラムでまとめられるのかもしれません。
参考までにどうぞ。