【问题标题】:How to trim a string from leftmost nearest + and rightmost nearest +? in progress 4gl如何从最左边最近的+和最右边最近的+修剪字符串?进行中 4gl
【发布时间】:2016-07-11 19:13:31
【问题描述】:

我需要修剪一个字符串,比如 abc+cd+ze:::123:::12+abcd ,给定 123 ,我需要提取 ze:::123:::12。

【问题讨论】:

  • 嗨! SUBSTRING 是显而易见的命令。您大概需要找到 123,然后确定您需要前后多远。你没有提供足够的信息来帮助你 - 规则是什么?您是否正在寻找两个 + 之间的所有内容?
  • 是的,所有给定的子字符串以及最近的两个 +s 之间的子字符串

标签: string trim progress-4gl openedge 4gl


【解决方案1】:

虽然从表面上看,子字符串是显而易见的方式,因为您正在寻找两个分隔符之间的东西,实际上 ENTRY 更容易。但是,只有当您可以保证您要查找的字符串不包含分隔符时,这才有效。 Progress 无法解码引用或以其他方式转义的分隔符。

这似乎对我有用:

DEF VAR testStr AS CHAR INITIAL "abc+cd+ze:::123:::12+abcd".
DEF VAR matchStr AS CHAR INITIAL "123".
DEF VAR outStr AS CHAR.
DEF VAR delim AS CHAR INITIAL "+".

DEF VAR i AS INT.

DO i = 1 TO NUM-ENTRIES( testStr, delim ): 
  IF ENTRY( i, testStr, delim ) MATCHES "*" + matchStr + "*" THEN DO:
    outStr = ENTRY( i, testStr, delim ).
    LEAVE.
  END.
END.

DISPLAY outStr.

【讨论】:

  • 当我看到这个问题时,我想让 OpenEdge 也将其视为一个分隔列表(以 + 作为分隔符)。但是我有一个带有位置字段和条目的临时表,并且在 DO i = 1 到 NUM-ENTRIES 的每次迭代中......我会创建一条记录,使 i 成为条目的位置和结果函数入口值。这样,您可以以更好的方式存储整个列表以进行搜索和使用。只是我的 2 美分
【解决方案2】:

正如Screwtape 所说,使用ENTRY 很容易做到这一点。

如果您出于某种原因想要使用INDEX 并搜索职位,您可以这样做。 R-INDEX 将帮助您 - 从右到左而不是从左到右搜索字符串。

如果您有多个条目与您的搜索字符串匹配,则此示例将出现问题。在这种情况下,它将返回最左边的匹配条目。

DEFINE VARIABLE cString  AS CHARACTER   NO-UNDO.
DEFINE VARIABLE cSearch  AS CHARACTER   NO-UNDO.
DEFINE VARIABLE cResult  AS CHARACTER   NO-UNDO.

DEFINE VARIABLE iPosition  AS INTEGER     NO-UNDO.
DEFINE VARIABLE iLeftPlus  AS INTEGER     NO-UNDO.
DEFINE VARIABLE iRightPlus AS INTEGER     NO-UNDO.
DEFINE VARIABLE iLength    AS INTEGER     NO-UNDO.

/* This is the string we're searching in */
cString = "abc+cd+ze:::123:::12+abcd".
/* This is what we're searching for */
cSearch = "123".

/* Get a starting position */
iPosition = INDEX(cString, cSearch).

/* Start at starting position and look right-to-left for a plus sign */
/* Add 1 since we don't want the plus sign */
iLeftPlus  = R-INDEX(cString, "+", iPosition) + 1.

/* Start at starting position and look left-to-right for a plus sign */
iRightPlus = INDEX(cString, "+", iPosition).

/* If there isn't a rightmost + */
IF iRightPlus = 0 THEN
    iRightPlus = LENGTH(cString).


/* Calculate the length of the result string */
iLength = iRightPlus - iLeftPlus.

/* Use substring to create resulting string */

cResult = SUBSTRING(cString, iLeftPlus, iLength).

MESSAGE cResult VIEW-AS ALERT-BOX INFORMATION.

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多