You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Progress OpenEdge字符串拆分求助:按规则实现用户输入字符串换行

嘿,作为OpenEdge新手碰到这种带空格的换行拆分确实容易懵——毕竟不能硬切单词,得找合适的空格位置对吧?我给你捋个清晰的算法思路,再附上可直接用的过程代码,一步步来:

核心算法思路

其实核心就是「找最近的空格断点」,步骤很明确:

  • 先初始化剩余待处理的字符串、每行最大长度(35),以及存储结果的容器(比如临时表)
  • 循环处理剩余字符串:
    • 如果剩余内容长度≤35,直接作为最后一行收尾
    • 否则,从第35个字符的位置往前倒着找最近的空格:
      • 找到的话,就把空格前的内容作为当前行,剩下的从空格后继续处理
      • 要是碰到极端情况(比如一个单词就超过35字符),那就只能硬切35字符(总比程序卡壳强)
  • 每处理完一行就存起来或者输出
Progress OpenEdge 实现过程

下面是封装好的过程,注释写得很清楚,你直接用就行:

PROCEDURE SplitStringByWord:
    DEFINE INPUT PARAMETER pcInputString AS CHARACTER NO-UNDO.
    DEFINE OUTPUT PARAMETER TABLE ttSplitLines LIKE STRING NO-UNDO. /* 用临时表存拆分后的所有行 */

    DEF VAR cRemaining AS CHARACTER NO-UNDO.
    DEF VAR iMaxLineLen AS INTEGER NO-UNDO INIT 35.
    DEF VAR iSplitPos AS INTEGER NO-UNDO.
    DEF VAR cCurrentLine AS CHARACTER NO-UNDO.

    cRemaining = TRIM(pcInputString). /* 先清掉首尾空格,避免生成多余空行 */

    DO WHILE LENGTH(cRemaining) > 0:
        /* 剩余内容直接能放下,直接收尾 */
        IF LENGTH(cRemaining) <= iMaxLineLen THEN DO:
            CREATE ttSplitLines.
            ttSplitLines.String = cRemaining.
            LEAVE.
        END.

        /* 关键逻辑:从第35位往前找最近的空格位置 */
        /* 先取从第35位到末尾的子串,反向找第一个空格,再换算回原字符串的位置 */
        iSplitPos = INDEX(RIGHT(cRemaining, LENGTH(cRemaining) - iMaxLineLen + 1), " ", -1) + iMaxLineLen - LENGTH(cRemaining) + 1.

        IF iSplitPos > 0 THEN DO:
            /* 找到空格,拆分后清掉两边多余空格 */
            cCurrentLine = TRIM(SUBSTRING(cRemaining, 1, iSplitPos - 1)).
            cRemaining = TRIM(SUBSTRING(cRemaining, iSplitPos + 1)).
        END.
        ELSE DO:
            /* 没找到空格,硬切(处理超长单词的极端情况) */
            cCurrentLine = SUBSTRING(cRemaining, 1, iMaxLineLen).
            cRemaining = SUBSTRING(cRemaining, iMaxLineLen + 1).
        END.

        /* 把当前行存入临时表 */
        CREATE ttSplitLines.
        ttSplitLines.String = cCurrentLine.
    END.
END PROCEDURE.
怎么用这个过程?

给你个测试示例,直接运行就能看到效果:

/* 先定义存储结果的临时表 */
DEFINE TEMP-TABLE ttSplitLines FIELD String AS CHARACTER.

/* 传入测试字符串,调用过程 */
RUN SplitStringByWord(
    INPUT "Many disciplines face challenges when it comes to text wrapping that respects word boundaries, especially in legacy systems like Progress OpenEdge where string handling can feel a bit clunky at first.",
    OUTPUT TABLE ttSplitLines
).

/* 输出拆分后的每一行 */
FOR EACH ttSplitLines:
    DISPLAY ttSplitLines.String WITH NO-LABELS.
END.
关键细节说明
  • 用TRIM处理拆分后的内容,是为了避免行首或行尾出现多余的空格
  • 反向找空格的逻辑是核心:INDEX(..., " ", -1)是从字符串末尾往前找第一个空格的位置,再换算回原字符串的坐标,确保我们找到的是35字符范围内最后一个可拆分的空格
  • 极端情况的处理(硬切):虽然不符合理想的单词拆分,但能避免因为超长单词导致程序报错,你可以根据需求调整这部分逻辑(比如提示用户有超长单词)

内容的提问来源于stack exchange,提问作者Colkazasi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:50:07