2016-03-24 3 views
0

Мне нужно обрезать строку, скажем, abc + cd + ze ::: 123 ::: 12 + abcd, учитывая 123, мне нужно извлечь ze ::: 123 ::: 12.Как обрезать строку из самых левых ближайших + и ближайших ближайших + +? in progress 4gl

+0

Привет! SUBSTRING - очевидная команда. Вам, вероятно, нужно найти 123, а затем определить, как далеко до и после того, как вам нужно. Вы не дали достаточной информации, чтобы иметь возможность помочь вам в этом - какие правила? Вы ищете все между двумя + s? – Screwtape

+0

Да, все подстроки заданы и между ближайшими двумя + s – mac100

ответ

0

Как Баламута сказал, что это довольно легко сделать это с помощью 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 рассматривал его как список с разделителями (с + в качестве разделителя). Но у меня есть временная таблица с полем позиции и записью, а на каждой итерации DO i = 1 - NUM-ENTRIES ... Я создал запись, сделаю позицию и результат функции входа - значение записи. Таким образом, вы сохраните весь список в лучшем виде для поиска и использования. Только мои 2 цента – bupereira

Смежные вопросы