2

C++ アプリケーションで正規表現を使用するつもりですが、正規表現の経験がありません。特に、次のカテゴリのいずれかに属している場合、いくつかの文字列をチェックしたいと思います。

X.anystring -> X は必ず文字 (数字ではない) でなければなりません。

XY.anystring -> X、Y は必ず 0 ~ 9 の数字 (文字ではない) でなければなりません。

正規表現を使用してそれらを確認するにはどうすればよいですか? 正規表現を理解するために、正規表現のどのチュートリアルをお勧めできますか?

4

6 に答える 6

3

真剣に、この場合、regexp:s は適切な解決策ではありません。

まず、regexp:s は C++ 言語の一部ではないため、特定の正規表現ライブラリを使用する必要があります。(C++11 には、regexp:s のサポートが含まれています。)

第二に、どちらのユース ケースも単純な C++ で簡単にエンコードできます。必要なのは、文字列内の文字をループして、それぞれが要件に一致するかどうかを確認することだけです。

于 2012-06-25T07:55:57.133 に答える
1

文字列がどちらに一致するかを知りたいだけで、どちらに一致するかは気にしない場合は、次を使用できます。

"(?:(?:[a-zA-Z])|(?:[0-9]{2}))\..*"

C++11regexECMAScript構文の使用。

于 2012-06-25T08:49:28.320 に答える
1

現在の C++11 標準では正規表現がサポートされていますが、どのコンパイラが正規表現をサポートしており、すぐに使用できるかはわかりません。

一方、Boost ライブラリは C++ 用の優れた正規表現システムを提供します (ここにリンク)。

正規表現について学ぶという点では、これが役立つかもしれません (Boost 正規表現の使用に焦点を当てています)。

ケースにとってより簡単な代替ソリューションは、自分でコーディングすることです。何かのようなもの:

bool check_first(const string& myString)
{
    if (!isalpha(myString[0]) || myString[1] != '.') return false;
    return true;
}

bool check_second(const string& myString)
{
    if (!isdigit(myString[0]) || !isdigit(myString[1]) || myString[2] != '.') return false;
    return true;
}
于 2012-06-25T07:48:11.540 に答える
1

X.anystring -> X は必ず文字 (数字ではない) でなければなりません。

必要な正規表現は

[a-zA-Z]\.[\w]+

XY.anystring -> X、Y は必ず 0 ~ 9 の数字 (文字ではない) でなければなりません。

必要な正規表現は

[0-9]{2}\.[\w]+

正規表現の詳細については、こちらをご覧ください。正規表現全般について学べば、任意の言語に適用できます。

于 2012-06-25T07:48:32.007 に答える
0

使用している正規表現ライブラリによって異なります。ただし、以下は Boost と C++11 の両方で機能するはずです。

X.anystring の場合 (X はアルファ):

"[[:alpha:]]\\..*"

XY.anystring の場合:

"[[:digit:]][[:digit:]]\\..*"

これらはregex_match;で使用します。を使用する場合regex_searchは、式を文字列の先頭に「^」を付けて「アンカー」する必要があります (ただし、最後の「.*」は削除できます)。

于 2012-06-25T08:15:53.580 に答える