| 
 | 
 
 
发表于 2025-5-12 08:47:44
|
显示全部楼层
 
 
 
- #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域。 |   
 
 
 
 |