C++基于正则表达式生成随机文本的实现与优化咨询
实现思路与代码优化指导
一、字符与数值对应关系说明
你要的拉丁字符和数值的对应规则就是ASCII编码规则,固定范围不需要瞎试:
- 大写英文字母A-Z:ASCII码范围
65~90 - 小写英文字母a-z:ASCII码范围
97~122 - 数字0-9:ASCII码范围
48~57 - 半角常用标点:
32~47、58~64、91~96、123~126
要生成随机拉丁字符直接在对应区间取随机数就行,比如rand() % 26 + 97就能直接得到随机小写字母,比你之前试区间的方法效率高很多。
二、现有代码核心问题修正
- 随机数种子重复设置问题
srand(time(0))整个程序只需要在启动时调用1次就够,你现在每个函数里都调用,如果两次调用间隔不到1秒,生成的随机数序列会完全重复。 getBoundary函数返回值错误
C++不能直接返回数组,你要返回上下限两个值可以用std::pair<int, int>,修改后的写法参考:
#include <utility> std::pair<int, int> getBoundary(string expression){ int ceiling = getCeilingValue(expression); int floor = getFloorValue(expression); return {ceiling, floor}; }
stuub函数字符串转换错误sizeof(byteArray)取的是string对象本身的大小,不是里面存的字符长度,你直接用byteArray就行,不用额外转string,还有你奇偶分上下限的逻辑完全没必要,改成指定区间随机更可控:
void practice::stuub(int min, int max, int length = 1000){ string byteArray; byteArray.reserve(length); // 提前申请空间,提高效率 for (int i = 0; i < length; i++) { // 生成[min, max]区间的随机数 byteArray.push_back(rand() % (max - min + 1) + min); } cout << byteArray << "\n"; }
- 嵌套if优化
用「提前跳出」的逻辑把嵌套if拆平,不符合条件直接跳过后续逻辑,不需要层层嵌套:
void practice::randomStringGen() { try { string choice; while (true) { cout << "\n enter an integer to generate random byte strings or press (q) to quit \n"; cin >> choice; // 直接判断退出,不用套后面的逻辑 if (choice == "q") { break; } // 不是数字直接提示跳过 if (!isNumeric(choice)) { cout << "\n " << choice << " is not an integer"; continue; } int input = stoi(choice); // 数值非法直接提示跳过 if (input <= 0) { cout << "\n you did not enter a valid integer. Enter numbers greater than 0"; continue; } // 剩下就是合法情况,直接执行逻辑 int mod0 = int(pow(input, input)); int mod1 = rand() % mod0 + 1; cout << "\n random string start:\n"; stuub(97, 122); // 示例:直接生成小写字母 cout << "\n :random string end\n"; } } catch(std::exception& e) { cout << e.what(); } }
改完之后没有任何嵌套if,逻辑更清晰。
三、正则随机文本生成的整体实现思路
你现在想靠总字节区间匹配正则的思路走偏了,正确的逻辑是先拆解正则表达式,拿到每个位置允许的字符范围,再在范围内随机生成:
- 先做简单正则的解析,比如先支持
[a-z0-9]这种字符集、{3,5}这种长度限定的基础语法 - 解析完正则后得到每个可生成位置的允许字符列表/范围
- 按照长度要求,每个位置在对应范围内随机取字符拼接即可
如果你现在还搞不定正则解析,可以先写死字符范围生成,先把随机生成的逻辑跑通,再慢慢加正则解析的功能。
内容的提问来源于stack exchange,提问作者yugely
相关产品推荐
相关产品推荐

