2016-03-24 24 views
0

Bir dize kesmem gerekiyor, diyelim abc + cd + ze ::: 123 ::: 12 + abcd, 123 verildi, ze'yi çıkarmam lazım ::: 123 ::: 12.Bir ipi en soldaki en yakın + ve en yakın + nasıl kırpılır? devam ediyor 4gl

+0

Merhaba! SUBSTRING bariz bir komuttur. Muhtemelen 123'ü bulmanız ve sonra ihtiyaç duyduğunuzdan önce ve sonra ne kadar uzak olduğunu belirlemeniz gerekir. Bu konuda size yardımcı olabilecek yeterli bilgi vermediniz - kurallar nelerdir? İki + s arasındaki her şeyi mi arıyorsunuz? – Screwtape

+0

Evet, verilen her şey ve en yakın iki + s arasındaki altlık – mac100

cevap

0

Screwtape o ENTRY kullanarak bunu yapmak için oldukça kolay söylediği gibi.

Eğer herhangi bir nedenle INDEX ve arama pozisyonlarını kullanmak istiyorsanız bunu yapabilirsiniz. R-INDEX size yardımcı olacaktır - dizeyi soldan sağa değil de sağdan sola doğru arama.

Örneğin, arama dizginizle eşleşen birden fazla girdiniz varsa, bu örnekte sorun olacaktır. Bu durumda en soldaki eşleşen girişi döndürür.

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

Yüzeyde iken, substring açık yoldur, çünkü iki sınırlayıcı arasında bir şey arıyorsanız, aslında GİRİŞ daha kolaydır. Ancak, yalnızca aradığınız dizenin sınırlayıcı içermediğini garanti ederseniz çalışır. İlerleme, alıntılanan veya başka bir şekilde kaçtılan sınırlayıcıların kodunu çözemez.

Bu benim için iş gibi görünüyor:

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

Soruyu gördüğümde, OpenEdge'in onu sınırlandırılmış bir liste olarak görmesini (+ sınırlayıcı olarak) düşündüm. Ama ben bir pozisyon alanı ve giriş ile bir temp-masa var ve her bir yinelemede DO i = 1 ila NUM-ENTRIES ... Bir kayıt oluşturacağım, pozisyon ve sonuç yapalım giriş fonksiyonu giriş değeri. Bu şekilde, tüm listeyi arama ve kullanma için daha iyi bir şekilde saklarsınız. Sadece 2 sentim – bupereira