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
cevap
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.
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.
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
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
Evet, verilen her şey ve en yakın iki + s arasındaki altlık – mac100