|
- #include <regex>
- #include <string>
- class regu {
- public:
- std::wstring ConvertBDToEQ(std::wstring input, bool is_outer, std::wregex sx_pattern);
- };
- std::wstring regu::ConvertBDToEQ(std::wstring input, bool is_outer, std::wregex sx_pattern) {
- std::wstring result = input;
- std::wsmatch match;
- // 调整后的正则表达式,匹配更通用的SX标签
- while (std::regex_search(result, match, sx_pattern)) {
- // 递归处理分子和分母,内层is_outer设为false
- std::wstring numerator = ConvertBDToEQ(match[1].str(), false, sx_pattern);
- std::wstring denominator = ConvertBDToEQ(match[2].str(), false, sx_pattern);
- // 根据is_outer决定是否包裹EQ域
- std::wstring eq_code = is_outer
- ? L"{EQ \\f(" + numerator + L"," + denominator + L")}"
- : L"\\f(" + numerator + L"," + denominator + L")";
- result = match.prefix().str() + eq_code + match.suffix().str();
- }
- return result;
- }
- // 调用示例
- int main() {
- // 调整后的正则表达式,匹配任意SX开始和结束标记
- std::wregex sx_pattern(LR"(〖SX[^〗]*〗\s*(.*?)\s*〖〗\s*(.*?)\s*〖SX[^〗]*〗)");
- std::wstring bd_content = L"〖SX〗(〖SX(〗1〖〗2〖SX〗 + 〖SX〗3〖〗4〖SX〗)〖〗5〖SX)〗";
- regu *pRegu = new regu();
- std::wstring result = pRegu->ConvertBDToEQ(bd_content, true, sx_pattern);
- delete pRegu;
- return 0;
- }
复制代码
修改说明:
正则表达式调整:
原正则表达式无法正确匹配嵌套标签,修改为更通用的〖SX[^〗]*〗,匹配任意SX开标签(如〖SX〗、〖SX(〗等)。
结束标签同理,使用〖SX[^〗]*〗匹配任意SX闭标签(如〖SX〗、〖SX)〗)。
确保正确捕获分子(.*?)和分母(.*?),允许中间包含其他SX标签(由递归处理)。
递归逻辑保持:
初始调用时is_outer=true,最外层替换为{EQ \\f(...)}。
递归处理分子/分母时is_outer=false,生成内层\\f(...)。
测试用例处理:
输入〖SX(〗1〖〗2〖SX〗会被正则匹配,递归处理为\\f(1,2)。
外层组合后生成{EQ \\f(\\f(1,2)+\\f(3,4),5},内层无EQ字样。
此修改确保内层嵌套结构通过递归正确替换,且仅在顶层包裹EQ域。 |
|