3

where文字列の最後に単語がある場合は、文字列をトリミングする必要があります。このためのC#での高速パフォーマンスアプローチは何ですか?

注:トリミングする単語は何でもかまいません..WHEREは単なる例です

string text1 = "My hosue where sun shines";  //RESULT: "My hosue where sun shines"
string text2 = "My where"; //RESULT: "My"
string text3 = "My where I WHERE"; //RESULT:"My where I"
4

6 に答える 6

4

これは、拡張メソッドによるLINQバリアントです。

public static string TrimEnd(this string s, string trimmer)
{
    //reverse the original string we are trimmimng
    string reversed = string.Concat(s.Reverse());
    //1. reverse the trimmer (string we are searching for)
    //2. in the Where clause choose only characters which are not equal in two strings on the i position
    //3. if any such character found, we decide that the original string doesn't contain the trimmer in the end
    if (trimmer.Reverse().Where((c, i) => reversed[i] != c).Any())
        return s; //so, we return the original string
    else //otherwise we return the substring
        return s.Substring(0, s.Length - trimmer.Length);
}

そしてそれを使用します:

string text1 = "My hosue where sun shines";  
string text2 = "My where"; 
string text3 = "My where I WHERE"; 
Console.WriteLine(text1.TrimEnd("where"));
Console.WriteLine(text2.TrimEnd("where"));
Console.WriteLine(text3.TrimEnd("WHERE"));
Console.ReadLine();

大文字と小文字が区別されます。s大文字と小文字を区別しないようにするには、両方を作成する必要がありtrimmer、拡張メソッドでは大文字と小文字を区別する必要があります。

さらに、1つの単語だけでなく、いくつかのフレーズを検索している場合でも機能します。

于 2012-11-01T06:18:51.763 に答える
4

あなたはstring.EndsWith方法を使用することができますstring.Substring

public static string Trim(this string s, string trimmer)
{

    if (String.IsNullOrEmpty(s)|| String.IsNullOrEmpty(trimmer) ||!s.EndsWith(trimmer,StringComparison.OrdinalIgnoreCase))
        return s;
    else
        return s.Substring(0, s.Length - trimmer.Length);
}
于 2012-11-01T06:38:09.687 に答える
2

あなたは正規表現でそれを行うことができます:

Regex.Replace(s, @"(\A|\s+)where\s*\Z", "", RegexOptions.IgnoreCase).Trim();

使用法:

"My hosue where sun shines".TrimWhere() // "My hosue where sun shines"
"My where".TrimWhere()                  // "My"
"My where I WHERE".TrimWhere()          // "My where I"
"".TrimWhere()                          // ""
"My blahWHERE".TrimWhere()              // "My blahWHERE"
"Where".TrimWhere()                     // ""

このサンプルでは、​​拡張メソッドを作成しました(System.Text.RegularExpressions名前空間を追加します)

public static class StringExtensions
{
   public static string TrimWhere(this string s)
   {
      if (String.IsNullOrEmpty(s))
          return s;

      return Regex.Replace(s, @"(\A|\s+)where\s*\Z", "", RegexOptions.IgnoreCase)
                  .Trim();
   }
}
于 2012-11-01T06:29:54.397 に答える
1

大文字と小文字を区別しないEndsWithメソッド呼び出しを使用して、文字列がトリミングする文字で終わっているかどうか、および文字列の末尾からトリミング文字列の文字数を削除しているかどうかを判断します。

メソッドでは、次のようになります。

private string MyTrimEnd(string s, string trimString) {
    if (s.EndsWith(trimString, StringComparison.OrdinalIgnoreCase)) {
        // A case-insenstive check shows the string ends with the trimString so remove from the
        // end of the string the number of characters in the trimString.  
        // Trim the result to leave no trailing space characters, if required.
        return s.Remove(s.Length - trimString.Length).Trim();
    } else {
        // The check showed the passed string does not end with the trimString so just return the
        // passed string.
        return s;
    }
}

テストと結果:

Console.WriteLine("'{0}'", MyTrimEnd(text1, "where"));      // 'My hosue where sun shines'
Console.WriteLine("'{0}'", MyTrimEnd(text2, "where"));      // 'My'
Console.WriteLine("'{0}'", MyTrimEnd(text3, "where"));      // 'My where I'
Console.WriteLine("'{0}'", MyTrimEnd("WHERE", "where"));    // ''
Console.WriteLine("'{0}'", MyTrimEnd("WHE", "where"));      // 'WHE'
Console.WriteLine("'{0}'", MyTrimEnd("blablaWHERE", "where"));  //'blabla'
Console.WriteLine("'{0}'", MyTrimEnd(string.Empty, "where"));  //''
Console.WriteLine("'{0}'", MyTrimEnd("WHEREwherE", "where"));  //'WHERE'

または拡張メソッドとして:

public static string MyTrimEnd(this string s, string trimString) {
    if (s.EndsWith(trimString, StringComparison.OrdinalIgnoreCase)) {
        return s.Remove(s.Length - trimString.Length).Trim();
    } else {
        return s;
    }
}
于 2012-11-01T06:43:08.950 に答える
0

まず、文字列を配列に分割して最後の配列要素を確認し、文字列を配列要素自体に置き換えます。

string[] words1 = text1.Split(' ');
string replaced_string = "";
if words1[words1.length-1]=='where'
for (int i = 0; i < length-2; i++)  
{
         replaced_string + words1[i] + " ";
}
replaced_string.TrimEnd();
text1 = replaced_string;

他のテキスト文字列についても同じことができます。

于 2012-11-01T06:27:15.070 に答える
0

@KonstantinVasilcovの回答の別のバージョンは

    public static string MyTrim1(string commandText, string trimmer)
    {

        if (String.IsNullOrEmpty(commandText) || String.IsNullOrEmpty(trimmer))
        {
            return commandText;
        }

        string reversedCommand = (string.Concat(commandText.Reverse())).ToUpper();
        trimmer = trimmer.ToUpper();

        if (trimmer.Reverse().Where((currentChar, i) => reversedCommand[i] != currentChar).Any())
        {
            return commandText;
        }

        else
        {
            return commandText.Substring(0, commandText.Length - trimmer.Length);
        }

    }
于 2012-11-01T06:43:10.523 に答える