2

次の例の文字列があります

"CTS3010 - 6ppl"

また

"CTs3200 - 14ppl"

また

 "CTS-500 2ppl"

これらの文字列から数値を解析する必要があります。文字列の末尾にある「ppl」の前の数値を解析する最良の方法は何ですか? 正規表現が必要ですか? 逆方向にループするロジックがありますが、ここにはもっとエレガントなソリューションがあるように感じます。

これらは単なる例ですが、すべての例は同じパターンに従っているようです。

  • テキストの束
  • ppl サフィックス
4

3 に答える 3

6

これを行うと、「ppl」の直前の番号を取得できます。

using System.Text.RegularExpressions;
...

Regex regex = new Regex("([0-9]+)ppl");
string matchedValue = regex.Match("CTS-500 122ppl").Groups[1].Value;

この場合matchedValueは 122 になります。

安全を確保したい場合、および「ppl」が常に文字列の最後にあることがわかっている場合は、正規表現を次のように変更します: "([0-9]+)ppl$"(唯一の違いは最後のドル記号です)。

于 2013-03-02T04:27:15.360 に答える
1

LINQ を使用する 1 つの方法を次に示します。

const String ppl = "ppl";
var examples = new[] { "CTS3010 - 6ppl", "CTs3200 - 14ppl", "CTS-500 2ppl" };
var delimiters = new[] { " " };
var result = examples
    .Select(e => e.Split(delimiters, StringSplitOptions.RemoveEmptyEntries))
    .Select(t => t.Last().ToLowerInvariant().Replace(ppl, String.Empty))
    .Select(Int32.Parse)
    .ToList();

整数値を解析できない場合、これは失敗することに注意してください。各文字列が で終わることを保証できない場合NNpplは、最初にそれが数値であることを確認する必要があります。

于 2013-03-02T04:28:18.313 に答える
0

「最善の方法」についてはわかりませんが、理解して変更するのが非常に簡単なメソッドの 1 つは、文字列オブジェクトの拡張メソッドです。

 public static int Parse(this string phrase)
    {
        if (string.IsNullOrWhiteSpace(phrase)) { throw new NullReferenceException("phrase is null");}

        string num = string.Empty;
        foreach (char c in phrase.Trim().ToCharArray()) {
            if (char.IsWhiteSpace(c)) { break; }
            if (char.IsDigit(c)) { num += c.ToString(); }
        }
        return int.Parse(num);
    }

" " がブレーク条件であると仮定します。数値や System.Text.StringBuilder を取得できない可能性がある場合は、int.TryParse を使用することをお勧めします。

于 2013-03-02T05:00:07.490 に答える