2

A-Z文字には、 、の 3 種類がありa-zます0-9

3 つのタイプすべてに 1 つ以上の文字を含む単語に一致する正規表現を作成する方法は?

例えば:

マッチ:abAcc88, Ua8za8, 88aA

歯が立たない:abc, 118, aa7, xxZZ, XYZ111

これboost::regex re("^[A-Za-z0-9]+$");はうまくいきません。

ありがとう

4

4 に答える 4

3

少なくとも IMO では、これをすべて 1 つの正規表現で実行しようとするのはお勧めできません。動作させることは可能ですが、最終的には読めない混乱が生じます。意図が全く見えない。

IMO、ロジックをより直接的に表現する方がはるかに優れています(ただし、プロセスで正規表現を1つか2つ使用しても害はありません):

boost::regex lower("[a-z]");
boost::regex upper("[A-Z]");
boost::regex digit("[0-9]");

if (find(string, lower) && find(string,upper) && find(string,digit))
    // it passes
else
    // it fails

これが何をしているのかを理解するには、RE への露出が最小限であっても、一目見ただけで十分です (RE への露出がなくても、それがa-z「キャラクターから") az

于 2013-05-09T15:42:07.200 に答える
2

各単語を個別にテストしていると仮定します。

boost::regex re("(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])");

アンカーは必要ありません。


実際、ブーストがルックアラウンドをサポートしていない場合:

boost::regex re(".*[a-z].*([A-Z].*[0-9]|[0-9].*[A-Z])|.*[A-Z].*([a-z].*[0-9]|[0-9].*[a-z])|.*[0-9].*([a-z].*[A-Z]|[A-Z].*[a-z])");

@Billが指摘したように、これはすべての組み合わせです。

于 2013-05-09T15:21:18.653 に答える
0

正規表現以外の方法を使用する場合は、それを最後まで使用しないでください ;-)

const char* c = "abAcc88";
char b = 0b000;
for (; *c; c++) b |= 48 <= *c && *c <= 57  ? 0b001 :
                    (65 <= *c && *c <= 90  ? 0b010 :
                    (97 <= *c && *c <= 122 ? 0b100 :
                                             0b000 ));
if (b == 0b111)
{
    std::cout << "pass" << std::endl;
}

(読めないなど、冗談です。)

于 2013-05-09T18:47:17.740 に答える