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
相关产品推荐
相关产品推荐

