3

文字列内で最初に出現する大文字のインデックスを見つけたい。

例 -

String x = "soHaM";

インデックスは、この文字列に対して 2 を返す必要があります。正規表現は、最初の大文字が見つかった後、他のすべての大文字を無視する必要があります。大文字が見つからない場合は、0 が返されます。助けてください。

4

6 に答える 6

5

楽しみのために、LINQソリューション:

string x = "soHaM";
var index = from ch in x.ToArray()
            where Char.IsUpper(ch)
            select x.IndexOf(ch);

これは を返しますIEnumerable<Int32>。最初の大文字のインデックスが必要な場合index.First()は、LINQ で最初のインスタンスのみを呼び出すか取得します。

string x = "soHaM";
var index = (from ch in x.ToArray()
            where Char.IsUpper(ch)
            select x.IndexOf(ch)).First();

編集

コメントで提案されているように、別の LINQ メソッドを次に示します (最初の提案よりもパフォーマンスが高い可能性があります)。

string x = "soHaM";
x.Select((c, index) => new { Char = c, Index = index }).First(c => Char.IsUpper(c.Char)).Index;
于 2012-04-23T12:37:27.583 に答える
5

必要なのは正規表現だけだと確信しています:A-Z \p{Lu}

public static class Find
{
  // Apparently the regex below works for non-ASCII uppercase
  // characters (so, better than A-Z).
  static readonly Regex CapitalLetter = new Regex(@"\p{Lu}");

  public static int FirstCapitalLetter(string input)
  {
    Match match = CapitalLetter.Match(input);

    // I would go with -1 here, personally.
    return match.Success ? match.Index : 0;
  }
}

これを試しましたか?

于 2012-04-23T12:35:51.383 に答える
4

必要はありませんRegex:

int firstUpper = -1;
for(int i = 0; i < x.Length; i++)
{
    if(Char.IsUpper(x[i]))
    {
        firstUpper = i;
        break;
    }
}

http://msdn.microsoft.com/en-us/library/system.char.isupper.aspx

完全を期すために、これが私のLINQアプローチです(ただし、OPが使用できたとしても、ここでは適切なツールではありません):

int firstUpperCharIndex = -1;
var upperChars = x.Select((c, index) => new { Char = c, Index = index })
                  .Where(c => Char.IsUpper(c.Char));
if(upperChars.Any())
    firstUpperCharIndex = upperChars.First().Index;
于 2012-04-23T12:38:30.470 に答える
3

最初にロジックが失敗します。メソッドが0を返した場合、そのリストの最初の文字が大文字であったことを意味するため、-1が見つからないか、例外をスローすることをお勧めします。

とにかく、正規表現を使用するのは、常に最良の選択であるとは限らないためです。さらに、正規表現は非常に遅く、一般的に読みにくいため、yoruコードの操作がはるかに困難になります。

とにかくここに私の貢献があります

    public static int FindFirstUpper(string text)
    {
        for (int i = 0; i < text.Length; i++)
            if (Char.IsUpper(text[i]))
                return i;

        return -1;
    }
于 2012-04-23T12:48:32.357 に答える
1

Linq の使用:

using System.Linq;

string word = "soHaMH";
var capChars = word.Where(c => char.IsUpper(c)).Select(c => c);
char capChar = capChars.FirstOrDefault();
int index = word.IndexOf(capChar); 

C# の使用:

using System.Text.RegularExpressions;

string word = "soHaMH";
Match match= Regex.Match(word, "[A-Z]");
index = word.IndexOf(match.ToString());
于 2012-04-23T12:58:24.000 に答える
1

ループの使用

 int i = 0;
 for(i = 0; i < mystring.Length; i++)
 {
   if(Char.IsUpper(mystring, i))
    break;
 }

i は、注目すべき値です。

于 2012-04-23T12:37:00.327 に答える