XL_TEST_ASSERT(r.Match(L"a"));
XL_TEST_ASSERT(!r.Match(L"ab"));
XL_TEST_ASSERT(!r.Match(L"b"));
XL_TEST_ASSERT(r.Parse(L"ab|c"));
XL_TEST_ASSERT(!r.Match(L"a"));
XL_TEST_ASSERT(!r.Match(L"b"));
XL_TEST_ASSERT(r.Match(L"c"));
XL_TEST_ASSERT(r.Match(L"ab"));
XL_TEST_ASSERT(!r.Match(L"bc"));
XL_TEST_ASSERT(!r.Match(L"ac"));
XL_TEST_ASSERT(r.Parse(L"a(b|c)"));
XL_TEST_ASSERT(!r.Match(L"a"));
XL_TEST_ASSERT(!r.Match(L"b"));
XL_TEST_ASSERT(!r.Match(L"c"));
XL_TEST_ASSERT(r.Match(L"ab"));
XL_TEST_ASSERT(r.Match(L"ac"));
XL_TEST_ASSERT(!r.Match(L"bc"));
}
XL_TEST_CASE()
{
RegExp r;
XL_TEST_ASSERT(r.Parse(L"\\|"));
XL_TEST_ASSERT(r.Match(L"|"));
XL_TEST_ASSERT(r.Parse(L"\\("));
XL_TEST_ASSERT(r.Match(L"("));
XL_TEST_ASSERT(r.Parse(L"\\)"));
XL_TEST_ASSERT(r.Match(L")"));
XL_TEST_ASSERT(r.Parse(L"\\\\"));
XL_TEST_ASSERT(r.Match(L"\\"));
XL_TEST_ASSERT(r.Parse(L"\\"));
XL_TEST_ASSERT(r.Match(L"\\"));
XL_TEST_ASSERT(r.Parse(L"\\|(\\(|\\))"));
XL_TEST_ASSERT(r.Match(L"|("));
XL_TEST_ASSERT(r.Match(L"|)"));
}
嗯……没有成就感。再来点有意思的。我们目前虽然只支持“|”和“(”“)”,但能做的事情已经很多了,比如匹配 0 到 255 的数字。
我们将 0 到 255 的数分为五类:
1. 一位数:(0|1|2|3|4|5|6|7|8|9)
2. 两位数:(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)
3. 三位数:
a) 0到199:(0|1)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)
b) 200到249:2(0|1|2|3|4)(0|1|2|3|4|5|6|7|8|9)
将这五个使用“|”连起来,就是一个0到255的正则表达式。
XL_TEST_CASE()
{
RegExp r;
XL_TEST_ASSERT(r.Parse(L"(0|1|2|3|4|5|6|7|8|9)|"
L"(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)|"
L"(0|1)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)|"
L"2(0|1|2|3|4)(0|1|2|3|4|5|6|7|8|9)|"
L"25(0|1|2|3|4|5)"));
XL_TEST_ASSERT(r.Match(L"0"));
XL_TEST_ASSERT(r.Match(L"1"));
XL_TEST_ASSERT(r.Match(L"2"));
XL_TEST_ASSERT(r.Match(L"3"));
XL_TEST_ASSERT(r.Match(L"4"));
XL_TEST_ASSERT(r.Match(L"5"));
XL_TEST_ASSERT(r.Match(L"6"));
XL_TEST_ASSERT(r.Match(L"7"));
XL_TEST_ASSERT(r.Match(L"8"));
XL_TEST_ASSERT(r.Match(L"9"));
XL_TEST_ASSERT(r.Match(L"10"));
XL_TEST_ASSERT(r.Match(L"20"));
XL_TEST_ASSERT(r.Match(L"30"));
XL_TEST_ASSERT(r.Match(L"40"));
XL_TEST_ASSERT(r.Match(L"50"));
XL_TEST_ASSERT(r.Match(L"60"));
XL_TEST_ASSERT(r.Match(L"70"));
XL_TEST_ASSERT(r.Match(L"80"));
XL_TEST_ASSERT(r.Match(L"90"));
XL_TEST_ASSERT(r.Match(L"100"));
XL_TEST_ASSERT(r.Match(L"199"));
XL_TEST_ASSERT(r.Match(L"200"));
XL_TEST_ASSERT(r.Match(L"249"));
XL_TEST_ASSERT(r.Match(L"250"));
XL_TEST_ASSERT(r.Match(L"251"));
XL_TEST_ASSERT(r.Match(L"252"));
XL_TEST_ASSERT(r.Match(L"253"));
XL_TEST_ASSERT(r.Match(L"254"));
XL_TEST_ASSERT(r.Match(L"255"));
XL_TEST_ASSERT(!r.Match(L"256"));
XL_TEST_ASSERT(!r.Match(L"260"));
XL_TEST_ASSERT(!r.Match(L"300"));
}
我们可以 YY 下现在的状态机的样子:
再来一个例子,匹配 IPv4。我们刚才已经有了0到255的数字的表示方法了,将他们用句点“.”连接起来就可以了。注意,“.”在我们目前的定义中没有特殊含义,只是普通字符
