A-Z
文字には、 、の 3 種類がありa-z
ます0-9
。
3 つのタイプすべてに 1 つ以上の文字を含む単語に一致する正規表現を作成する方法は?
例えば:
マッチ:abAcc88, Ua8za8, 88aA
歯が立たない:abc, 118, aa7, xxZZ, XYZ111
これboost::regex re("^[A-Za-z0-9]+$");
はうまくいきません。
ありがとう
少なくとも 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
「キャラクターから") a
。z
各単語を個別にテストしていると仮定します。
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が指摘したように、これはすべての組み合わせです。
正規表現以外の方法を使用する場合は、それを最後まで使用しないでください ;-)
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;
}
(読めないなど、冗談です。)