web-dev-qa-db-ja.com

文字列の末尾から文字列を削除するC#

文字列の配列があります:

string[] remove = { "a", "am", "p", "pm" };

そして、ユーザーがテキストを入力するテキストボックスがあります。テキストボックスのテキストの最後にあるremove配列に文字列を入力した場合、削除する必要があります。これを行う最も簡単な方法は何ですか?

[〜#〜] edit [〜#〜]明確にするために、タイムパーサーを作成しています。関数に文字列を指定するとき、次の形式に解析するのが最善です:08:14pm私はそれをテストするためのテキストボックスを持っています。フォーカスがテキストボックスを離れるとき、数字のみのセグメントを解析できるように、接尾辞am/pm/a/pなしでテキストを取得する必要があります。

35
Entity
string[] remove = { "a", "am", "p", "pm" };
string inputText = "blalahpm";

foreach (string item in remove)
    if (inputText.EndsWith(item))
    {
        inputText = inputText.Substring(0, inputText.LastIndexOf(item));
        break; //only allow one match at most
    }
70
BrokenGlass
foreach (string suffix in remove)
{
    if (yourString.EndsWith(suffix))
    {
        yourString = yourString.Remove(yourString.Length - suffix.Length);
        break;
    }
}
16
LukeH

BrokenGlassのソリューションは良いものだと思いますが、個人的には、ユーザーが開始、終了、または両方のみをトリムできる3つの個別のメソッドを作成することを好みます。

これらのわずらわしさを頻繁に使用する場合は、ヘルパークラスで作成するか、拡張メソッドとして作成します。 http://msdn.Microsoft.com/en-gb/library/vstudio/bb383977.aspx

public string TrimStart(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase)
{
    if (!string.IsNullOrEmpty(value))
    { 
        while (!string.IsNullOrEmpty(inputText) && inputText.StartsWith(value, comparisonType))
        {
            inputText = inputText.Substring(value.Length - 1);
        }
    }

    return inputText;
}

public string TrimEnd(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase)
{
    if (!string.IsNullOrEmpty(value))
    {
        while (!string.IsNullOrEmpty(inputText) && inputText.EndsWith(value, comparisonType))
        {
            inputText = inputText.Substring(0, (inputText.Length - value.Length));
        }
    }

    return inputText;
}

public string Trim(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase)
{
    return TrimStart(TrimEnd(inputText, value, comparisonType), value, comparisonType);
}

これらのメソッドを使用して、トリミングする文字列を含む配列をループするためのコードを変更できます。

var content = "08:00 AM";
var removeList = new [] { "a", "am", "p", "pm" };

for (var i = 0; i < removeList.length; i++)
{
    content = TrimEnd(content, removeList[i]);
}

注:このコードはさらに最適化できますが、そのままの状態で適切な速度で機能します。

7
Shane Yu

編集に基づいて、組み込みの DateTime.TryParse または DateTime.Parse メソッドの後にString.Formatを使用することを検討してください。 文字列のフォーマットに関する優れたリソース へのリンクもあります。

4
Metro Smurf

おそらく、DateTimeをプライマリタイプとして使用できます。

つかいます DateTime.TryParseユーザーが入力した時間を読み取ります。そして、DateTime.ToString必要な形式を使用して時間を再フォーマットします。

1
C. Dragon 76

正規表現に適した場所のようです。

using System.Text.RegularExpressions;

public bool IsValidTime(string thetime)
{
  Regex checktime = new Regex(@"^(20|21|22|23|[01]\d|\d)(([:][0-5]\d){1,2})$");

  return checktime.IsMatch(thetime);
} 

Xx:xxの形式の時間が必要だと仮定します

1
Chris Klepeis
var output = (from x in remove
      where input.EndsWith(x)
     select input.Substring(0, input.Length - x.Length)).FirstOrDefault() ?? input;
1
Jeff Ogata
char[] remove = { 'a', 'p', 'm' };
string s = "8:14pm";

s = s.TrimEnd(remove);
0
ulty4life