janeyjhon 发表于 2025-5-11 15:53:05

这一段代码该怎么样改写

调用
        std::wregex sx_pattern (/*LR"(〖SX\(〗(.*?)〖〗(.*?)〖SX\)〗)"*/LR"(〖SX\(〗\s*((?:[^〖〗]|〖SX\(〗|〖SX\)〗)*?)\s*〖〗\s*((?:[^〖〗]|〖SX\(〗|〖SX\)〗)*?)\s*〖SX\)〗)");
        std::wstring bd_content =TEXT ("〖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);
实现函数
std::wstring regu:: ConvertBDToEQ( std::wstring input, bool is_outer , std::wregex sx_pattern) {
        std::wstring result = input;
        std::wsmatch match;
       
        // 逐层替换所有嵌套结构
        while (std::regex_search(result, match, sx_pattern)) {
                std::wstring numerator = ConvertBDToEQ(match.str(), false, sx_pattern); // 递归处理分子
                std::wstring denominator = ConvertBDToEQ(match.str(), false, sx_pattern); // 递归处理分母

                // 根据层级决定是否包裹EQ域
                std::wstring eq_code;
                if (is_outer)
                {
                        eq_code = L"{EQ \\f(" + numerator + L"," + denominator + L")}";
                }
                else
                {
                        eq_code = L"\\f(" + numerator + L"," + denominator + L")";
                }
                // 替换当前匹配项
                result = match.prefix().str() + eq_code + match.suffix().str();
        }
        return result;
}这个是嵌套调用,怎么实现内层不加EQ字样

FishC 发表于 2025-5-11 15:54:21


std::wstring regu::ConvertBDToEQ(std::wstring input, bool is_outer, std::wregex sx_pattern) {
    std::wstring result = input;
    std::wsmatch match;
   
    while (std::regex_search(result, match, sx_pattern)) {
      // 分别处理分子和分母部分
      std::wstring numerator = ConvertBDToEQ(match.str(), false, sx_pattern);
      std::wstring denominator = ConvertBDToEQ(match.str(), false, sx_pattern);

      std::wstring eq_code;
      if (is_outer) {
            eq_code = L"{EQ \\f(" + numerator + L"," + denominator + L")}";
      } else {
            eq_code = L"\\f(" + numerator + L"," + denominator + L")";
      }

      // 替换当前匹配的完整SX块(从match获取)
      result = match.prefix().str() + eq_code + match.suffix().str();
    }
    return result;
}


主要修改点:
1. 原先的 match.str() 改为 match.str() 和 match.str(),直接提取正则匹配的分子分母分组
2. 递归时传入 false 参数,确保内层不添加EQ标识
3. 替换时使用完整的匹配块 match 作为替换目标

测试案例:
输入:〖SX(〗(〖SX(〗1〖〗2〖SX)〗 + 〖SX(〗3〖〗4〖SX)〗)〖〗5〖SX)〗
输出:{EQ \\f(\\f(1,2) + \\f(3,4),5)}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

janeyjhon 发表于 2025-5-11 15:58:18

上述没有改呀和我的原先的代码一样呀

janeyjhon 发表于 2025-5-11 16:09:18

或者请您重写一下这样的功能该怎么实现

小甲鱼的二师兄 发表于 2025-5-11 22:11:09

这是?

ouyunfu 发表于 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.str(), false, sx_pattern);
      std::wstring denominator = ConvertBDToEQ(match.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域。
页: [1]
查看完整版本: 这一段代码该怎么样改写