夕月(xiyue) 是一个基于 C++ 编写的基础功能库,包含了一些自己实现的平时可能会经常用到的一些功能。
这个库目前包含以下功能:
ConstString
引用字符串;Json
库。Variant
可变类型。XyRe
正则表达式引擎。
是一种高级的 union
结构,成员可以是任意类型。例如:
Variant<int, double, bool, wstring, vector<int>> v;
static_assert(v.bufferSize == sizeof(wstring), "Variant size incorrect.");
EXPECT_TRUE(v.isNull());
v = 1;
EXPECT_TRUE(v.is<int>());
EXPECT_EQ(v.get<int>(), 1);
v = 3.14159;
EXPECT_TRUE(v.is<double>());
EXPECT_FALSE(v.is<int>());
EXPECT_NEAR(v.get<double>(), 3.14159, 0.00001);
v = false;
EXPECT_TRUE(v.is<bool>());
EXPECT_EQ(v.get<bool>(), false);
v = wstring(L"Hello world!");
EXPECT_TRUE(v.is<wstring>());
EXPECT_EQ(v.get<wstring>(), L"Hello world!");
v = vector<int>({ 1, 2, 3 });
EXPECT_TRUE(v.is<vector<int>>());
EXPECT_EQ(v.get<vector<int>>().size(), 3u);
EXPECT_THROW(v.get<int>(), std::bad_cast);
double val = 0.0;
EXPECT_THROW(val = v, std::bad_cast);
是一个基于 DFA(虚拟机形式) 和 NFA 混合的正则表达式引擎,支持以下正则表达式语法:
转义字符:
- \f,换页符,等价于 \x0c
- \n,换行符,等价于 \x0a
- \r,回车符,等价于 \x0d
- \s,空白字符,等价于 [ \f\n\r\t\v]
- \S,非空白字符,等价于 [^ \f\n\r\t\v]
- \t,制表符,等价于 \x09
- \v,垂直制表符,等价于 \x0b
- \b,匹配单词边界
- \B,匹配非单词边界
- \d,匹配一个数字,等价于 [0-9]
- \D,匹配一个非数字,等价于 [^0-9]
- \w,匹配一个单词字符,等价于 [a-zA-Z0-9_]
- \W,匹配一个非单词字符,等价于 [^a-zA-Z0-9_]
- \G,全局匹配中有效,必须匹配上一次匹配结束的位置
- \xXX,转义 ASCII 字符
- \uXXXX,转义 unicode 字符
- \0XXX,转义八进制 ASCII 字符
- \0,匹配 NUL
- \1 ~ \9,反向引用分组
- \X,代表 X 字符本身
元字符:
- ^,匹配行首
- $,匹配行尾
- .,匹配任意字符
- [xxx],字符类
- [^xxx],反向字符类
量词:
-
*,匹配0次到多次
-
+,匹配1次到多次
-
?,匹配0次或1次
-
{n},匹配固定 n 次
-
{n,},匹配 n 次到多次
-
{n,m},匹配 n 次到 m 次
-
*?,非贪婪匹配
-
+?
-
??
-
{n}?,无效,等价于 {n}
-
{n,}?
-
{n,m}?
-
*+,占有优先
-
++
-
?+
-
{n}+
-
{n,}+
-
{n,m}+
-
捕获组,(xxx)
-
固化分组,(?>xxx)
-
非捕获组,(?:xxx)
-
Look Ahead 断言,(?=xxx) 和 (?!xxx)
-
Look Behind 断言,(?<=xxx) 和 (?<!xxx)
-
命名捕获组,(?xxx)
-
命名反向引用,\k
-
匹配模式开关,(?imx) ... (?-imx),i 为忽略大小写,m 为多行匹配(影响 ^ 和 $),x 为松散模式
-
内部模式开关,(?imx:xxx)
-
注释,(?#xxxx)
-
(暂不实现)Unicode 属性,\p{Script_Extensions=Greek}
替换格式支持:
$number
或 ${number}
表示捕获组引用,如果 number
是个无效组,则直接替换成数字。
${name}
表示对命名捕获组的引用。name
无效时,则直接替换 {name}
字符串。
$$
替换为 $
。
$&
替换为整个匹配项,等价于 $0
。
$` 替换为 prefix。
$'
替换为 suffix。
$+
替换为最后一个数字捕获组。
$_
替换为整个输入串。
$U
开启大写转换模式,后续替换的捕获组都将尝试转换成大写字符进行替换。
$E
恢复默认替换模式,不对原字符串进行大小写转换。
$L
开启小写转换模式,后续替换的捕获组都将尝试转换成小写字符进行替换。
其它任何未识别的指令,都将原样输出(不带 $ 符号)。