Üzgünüz, önceki cevap ihtiyacınız olan şey değildi. Onu bırakmaya karar verdim, çünkü belirtildiği gibi problem için güzel bir çözüm. Ama tekrar deneyeceğim. Sınırları kontrol etmeyi ayrı bir işlev yaptım, böylece gereksinimlerinize kolayca uyarlayabilirsiniz. Çoklu bayt karakter yetenekleri eklemek kolay olmalıdır.
DEFINE VARIABLE v-segment AS LONGCHAR NO-UNDO.
DEFINE VARIABLE v-element AS CHARACTER NO-UNDO.
DEFINE VARIABLE v-delims AS CHARACTER NO-UNDO.
DEFINE VARIABLE v-index AS INTEGER NO-UNDO.
DEFINE VARIABLE v-delimCount AS INTEGER NO-UNDO.
DEFINE VARIABLE v-segLength AS INTEGER NO-UNDO.
DEFINE VARIABLE v-eltLength AS INTEGER NO-UNDO.
DEFINE VARIABLE v-psn AS INTEGER NO-UNDO.
ASSIGN v-segment = "STS++5623+56"
v-element = "56"
v-delims = "+:"
/* For efficiency, don't calculate these inside your loop */
v-seglength = LENGTH(v-segment)
v-eltLength = LENGTH(v-element)
v-delimCount = LENGTH(v-delims).
/*
** isDelin()
** Is character at specified positiion one of the delimiters?
**
** Params:
** CHARACTER p-str - string to search
** INTEGER p-psn - position to check
** CHARACTER p-delims - list of delimiters to check for
**
** Returns TRUE if character at specified position is a delimiter
** Otherwise, returns FALSE
*/
FUNCTION isDelim RETURNS LOGICAL (
INPUT p-str AS LONGCHAR,
INPUT p-psn AS INTEGER,
INPUT p-delims AS CHARACTER
):
/* You might want parameter checking here.... */
RETURN INDEX(p-delims, SUBSTRING(p-str, p-psn, 1)) > 0.
END FUNCTION. /* isDelim */
/*
** You might want special case handling here:
** if v-eltLength = 0 then v-index = 1. return.
** IF v-element = ? or v-segment = ? then v-index = 0. return.
*/
/* Look for v-element, then see if it is surrounded by delimiters */
v-index = 0.
DO WHILE TRUE:
v-index = INDEX(v-segment, v-element, v-index + 1).
If v-index = 0 THEN LEAVE. /* No more matches */
/*
** Found a match. Is it preceded by a delimiter?
** (Don't check if match is at beginning of string.)
*/
v-psn = v-index - 1.
IF v-psn > 0 AND NOT isDelim(v-segment, v-psn, v-delims) THEN NEXT.
/*
** Is match followed by a delimiter?
** (Don't check if match is at end of string.)
*/
v-psn = v-index + v-eltLength.
IF v-psn > v-seglength THEN LEAVE.
IF NOT isDelim(v-segment, v-psn, v-delims) THEN NEXT.
/* Success! */
LEAVE.
END.
MESSAGE v-index VIEW-AS ALERT-BOX INFO BUTTONS OK.
Başlığınızda "ayırıcılarla ayrılmış" yazıyor. Ancak sorunun bedeni sınırlayıcıların ne olduğunu ve neden önemli olduklarını göstermez. Neden 6'dan niçin mutsuz olduğunuzu ve 11'in daha iyi bir cevap verdiğini de açıklamıyor musunuz? İhtiyacınızı yorumlamanın bir yolu, ilkinden ziyade "56" nın ikinci örneğini istemektir. Ama gerçekliğin bundan daha karmaşık olduğundan şüpheleniyorum. –