デリミタが2つしかない場合は、このコードを使用して検索を行うことができます。それは3つ以上のデリミタに拡張することができますが、私は多分コードを構造化するでしょう。 (私は区切り文字のリストをループします。そのようなコードが必要な場合は教えてください)
実行する文字列検索の数を最小限に抑えることを目的としています。各検索後に両方の区切り文字を検索するのではなく、1つを検索するだけで十分です。私は、これによって明快さを損なうことなく演技をすることができると信じていますが、私はベンチマーキングを行っていないので、間違っている可能性があります。そして、いつものように、最適なソリューションはデータの性質に依存します。
DEFINE VARIABLE v-edistring AS CHARACTER NO-UNDO.
DEFINE VARIABLE v-cnt AS INTEGER NO-UNDO.
DEFINE VARIABLE segment AS CHARACTER NO-UNDO.
DEFINE VARIABLE v-curpsn AS INTEGER NO-UNDO.
DEFINE VARIABLE v-idxplus AS INTEGER NO-UNDO.
DEFINE VARIABLE v-idxcolon AS INTEGER NO-UNDO.
DEFINE VARIABLE v-element AS CHARACTER NO-UNDO.
v-edistring = "STS++56+202:::DUE TO HOLIDAY1'STS++56+202:::DUE TO HOLIDAY2'STS++56+202:::DUE TO HOLIDAY3'".
DO v-cnt = 1 TO num-entries(v-edistring, "'") - 1 :
ASSIGN segment = string(entry(v-cnt, v-edistring, "'")).
MESSAGE "SEGMENT: " segment
VIEW-AS ALERT-BOX INFO BUTTONS OK.
/*
** Cleverness here....
** Find the first positions of each delimiter in the segment
**
** Then:
** Clip out an element of the segment up through the next nearest delim.
** Recalculate the next postion of that delimiter
** ... and loop
*/
v-curpsn = 1.
v-idxplus = INDEX(segment, "+", v-curpsn).
v-idxcolon = INDEX(segment, ":", v-curpsn).
DO WHILE TRUE:
IF v-idxplus = 0 THEN DO:
IF v-idxcolon = 0 THEN LEAVE. /* no more delimiters */
/* Otherwise, next delim is a colon */
v-element = SUBSTRING(segment, v-curPsn, v-idxcolon - v-curPsn).
v-curpsn = v-idxcolon + 1.
/* No need to recalculate v-idxplus */
v-idxcolon = INDEX(segment, ":", v-curpsn).
END.
ELSE DO: /* v-idxplus > 0 */
IF v-idxcolon = 0 OR v-idxcolon > v-idxplus THEN DO:
/* Either no colons, or next delim is a plus */
v-element = SUBSTRING(segment, v-curPsn, v-idxplus - v-curPsn).
v-curpsn = v-idxplus + 1.
/* No need to recalculate v-idxcolon */
v-idxplus = INDEX(segment, "+", v-curpsn).
END.
ELSE DO: /* both > 0, but idxplus is next delim */
v-element = SUBSTRING(segment, v-curPsn, v-idxcolon - v-curPsn).
v-curpsn = v-idxcolon + 1.
/* No need to recalculate v-idxplus */
v-idxcolon = INDEX(segment, ":", v-curpsn).
END.
END.
/*
** Display result. Skip empty elements. If you want to ignore
** pure white space (e.g. " "), then you can change this to
** IF v-element <> ""
*/
IF LENGTH(v-element) > 0 THEN DO:
MESSAGE v-element
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
END.
/*
** No more delimiters. But there still might be one element left */
IF v-curpsn < LENGTH(segment) THEN DO:
v-element = SUBSTRING(segment, v-curPsn).
MESSAGE v-element
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
END