2016-03-24 64 views
0

我需要修剪一個字符串,比如說abc + cd + ze ::: 123 ::: 12 + abcd,給123,我需要提取ze ::: 123 ::: 12。如何從最靠近的最近的+和最靠近的最近的+修剪一個字符串?正在進行中4gl

+0

嗨! SUBSTRING是顯而易見的命令。你大概需要找到123,然後確定你需要之前和之後有多遠。你還沒有提供足夠的信息來幫助你 - 那些規則是什麼?你在尋找兩個人之間的一切嗎? – Screwtape

+0

是的,所有的字符串給出和最近的兩個+ s之間 – mac100

回答

0

正如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. 
1

表面上,子字符串是顯而易見的方式,因爲您正在尋找兩個分隔符之間的東西,實際上ENTRY更容易。但是,只有在可以保證所查找的字符串不包含分隔符的情況下才有效。進度無法解碼帶引號或以其他方式逃脫的分隔符。

這似乎爲我工作:

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. 
+0

當我看到這個問題時,我想讓OpenEdge把它看作一個分隔列表(用+作爲分隔符)。但我有一個帶有位置字段和條目的臨時表,並且在每次迭代中,我都會創建一個記錄,使我成爲位置和結果的入口函數的入口值。 這樣,您就可以以更好的方式將整個列表存儲起來進行搜索和使用。只是我2美分 – bupereira