Openedge 进程4gl控制字符删除

Openedge 进程4gl控制字符删除,openedge,progress-4gl,control-characters,Openedge,Progress 4gl,Control Characters,我想删除给定字符串中的所有控制字符。我不想使用Replace方法,因为它需要多次迭代。 帮帮我 提前谢谢 您可能不喜欢它,但替换是最简单的方法。我用这段代码从字符串中去掉了不可打印的字符。这将用空格替换控制字符: DEFINE VARIABLE str AS CHARACTER NO-UNDO. DEFINE VARIABLE iLoop AS INTEGER NO-UNDO. DO iLoop = 1 TO 31: str = REPLACE(str, CHR(iLoop), " "

我想删除给定字符串中的所有控制字符。我不想使用Replace方法,因为它需要多次迭代。 帮帮我


提前谢谢

您可能不喜欢它,但
替换
是最简单的方法。我用这段代码从字符串中去掉了不可打印的字符。这将用空格替换控制字符:

DEFINE VARIABLE str AS CHARACTER NO-UNDO.
DEFINE VARIABLE iLoop AS INTEGER NO-UNDO.

DO iLoop = 1 TO 31:
    str = REPLACE(str, CHR(iLoop), " ").
END.

由于必须删除多个控制字符,因此任何解决方案似乎都会涉及多次迭代。

这取决于您定义为控制字符的内容和使用的字符集,这可能会起到作用。或者至少为您指出一个有用的方向:

define variable i as integer   no-undo.
define variable n as integer   no-undo.
define variable c as character no-undo.
define variable s as character no-undo.
define variable x as character no-undo.

s = "something with control characters in it".
x = "".

n = length( s ).
do i = 1 to n:
  c = substring( s, i, 1 ).
  if asc( c ) >= 32 and asc( c ) < 127 then
    x = x + c.
end.
将变量i定义为不撤消的整数。
将变量n定义为不撤消的整数。
将变量c定义为无撤消字符。
将变量s定义为不撤消的字符。
将变量x定义为无撤消字符。
s=“其中包含控制字符的内容”。
x=”“。
n=长度(s)。
i=1到n:
c=子串(s,i,1)。
如果asc(c)>=32且asc(c)<127,则
x=x+c。
终止

谢谢,但是有没有办法用正则表达式来代替它。OpenEdge本机不支持正则表达式,但您可以使用.Net对象:谢谢,汤姆,但我想减少迭代次数。如果有任何方法可以通过使用正则表达式来完成同样的任务,请帮助我。如果你想象正则表达式不在字符串上迭代,你会感到失望,你可能会问你的实际问题。这很明显是类似于“我能用正则表达式进行处理吗?”。