1

私のC#アプリでは、文字列を検索して、それらが測定単位の略語であるかどうかを確認する必要があります。たとえば、ミリメートルの場合は「mm」、リットルの場合は「l」、平方メートルの場合は「m2」、キログラムの場合は「kg」などを見つける必要があります。文字列がパターンと完全に等しい場合にのみ一致が必要ですが、パターンがより大きな文字列に含まれている場合は必要ありません。たとえば、文字列が「mm」に等しい場合、一致させたいのですが、文字列が「長さ55mm」の場合は一致しません。

最も簡単な方法は、一連のif-else ifステートメントと==演算子を使用することですが、問題になる可能性があるのは、ユーザーが検索するすべてのユニットの名前が事前にわからないことです。 、それらは異なるユニットのセットで動作する可能性があります。たとえば、ある場合は長さと体積の単位(mm、m、cm、m3、l)であり、他の場合は電気単位(A、V、W、MW、kWh)である可能性があります。

したがって、私のアイデアは、アプリケーションが実行時に実際の単位を読み取り、文字列の検索に使用する正規表現を作成するwitchからの短いXMLファイルをプロジェクトに追加することです。最初の試みとして、私はこのアプローチを使用しました:

private bool IsUnit(String theString)
    {
        Regex regExUnits = new Regex("^(?i)m2|m3|kg|mm|cm|[mthl]$");
        Match m = regExUnits.Match(theString);
        return m.Success;
    }

しかし、それは私が望むようには機能しません。「mm」に一致しますが、「長さ55mm」にも一致します。

「^」と「$」の両方のアンカーを使用すると、「パターンが文字列の最初と最後にある場合に一致する」と解釈されると思いました。これは、完全に等しい場合にのみ当てはまります。しかし、いいえ、「パターンが文字列の最初と最後にある場合は一致する」と解釈されているようです。

私は以前に正規表現を使用したことがありますが、これよりもはるかに単純なケースであるため、今のところ行き詰まっています。

よろしくお願いします。

4

3 に答える 3

4

これには正規表現を使用しません。HashSet<string>要素があまりない場合は、または単純な配列を使用します。

static readonly string[] Units = { "m2", "m3", "kg", "mm", "cm", 
                                   "m", "t", "h", "l" };

private static bool IsUnit(string text)
{
    return Units.Contains(text);
}

または:

static readonly HashSet<string> Units = new HashSet<string> { 
    "m2", "m3", "kg", "mm", "cm", "m", "t", "h", "l" };

// IsUnit method as before

単純な文字列の等価性については、IMO の価値よりも正規表現の方が厄介です。

もちろん、ユニットは、囲んでいるクラスのインスタンスごとに指定することも、何でも指定できます。質問でもハードコードされているため、ここでは静的にハードコードしただけです。

編集: この大文字と小文字を区別しないようにするための最も簡単な方法は、おそらくHashSetバージョンを使用し、適切なStringComparerで構築することです。

static readonly HashSet<string> Units =
    new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ... };

(ただし、カルチャの機密性の観点から、どのような種類の大文字と小文字を区別しないかを正確に理解する必要があります。)

ただし、ユニット名通常、大文字と小文字を区別しないわけではないため、これには反対することをお勧めします。

于 2013-03-14T15:52:42.527 に答える
1

ブラケットを忘れた!

"^(?i)(?:m2|m3|kg|mm|cm|[mthl])$"

?:オプションであり、このグループに一致する値を取得しないことを意味します。

于 2013-03-14T15:51:48.553 に答える
0

それが何らかのユニットであるかどうかを知る必要がありますか?

public static void Main()
{
    string input = Console.ReadLine();
    string[] sarr = { "kg", "li", "mm" };
    bool isUnit = sarr.Contains(input);
}
于 2013-03-14T15:55:16.107 に答える