안녕하세요. 문자열에서 반복되는 문자를 제거하는 함수에 관심이 있습니다.
이 위시리스트 요청은 어떻게 시작되었나요? 문자열에 동일한 문자가 반복해서 나타나는데, 그 문자를 하나만 남기고 모두 제거하고 싶을 때가 있습니다. 예를 들어, "input1;;;;input2;;;input3"와 같은 문자열을 "input1;input2;input3"로 바꾸고 싶습니다. 저는 `SubstituteInto(str, ";;", ";")`를 사용하면 반복되는 세미콜론(;)을 모두 재귀적으로 제거할 수 있을 거라고 생각했지만, 그렇지 않았습니다. `SubstituteInto(str, ";;", ";")`는 세미콜론을 하나만 남기고 제거하는 것이 아니라, 처음 두 개의 세미콜론만 제거하고 멈췄습니다.
str = "input1;;;input2;;;input3";<BR />SubstituteInto(str, ";;", ";");<BR />Show(str); //returns "input1;;input2;;;input3"
첫 번째 세미콜론 세트는 3개에서 2개로 줄었고, 두 번째 세트는 전혀 영향을 받지 않았다는 점에 유의하세요. 현재 제 임시 해결책은 이 코드를 while 루프 안에 넣는 것입니다.
curlen = Length(str) + 1;
While(Length(str) < curlen,
SubstituteInto(str, ";;", ";");
); //returns "input1;input2;input3"
어떤 개선 사항을 원하시나요? 저는 Substitute(), SubstituteInto(), Munger() 함수에 "<< 재귀 호출" 메시지를 추가하여 위 코드와 동일한 작업을 수행하도록 수정했으면 좋겠습니다.
Substitute(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />SubstituteInto(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />Munger(s, startpos, findstringOrNChars,
<REPLACESTRING>
>);
</REPLACESTRING>
</RECURSE>
</IGNORECASE>
</RECURSE>
</IGNORECASE>
또는 기존 기능을 변경하는 대신 "Trim Multiple()"이라는 새로운 기능을 만드는 것도 고려해 볼 수 있습니다.
Trim Multiple(s, patternString);
여기서 s는 문자열이고 patternString은 하나 이상의 문자입니다. 코드는 s에서 patternString이 연속해서 반복되는 부분을 찾습니다. 반복되는 부분을 찾으면 해당 부분을 patternString의 한 문자로 바꾸고, s에서 patternString이 다시 반복되는 부분을 계속 찾습니다.
이 아이디어가 중요한 이유는 무엇일까요? 이는 사용자의 코드 복잡성을 줄여줄 뿐만 아니라, Substitute()/SubstituteInto()/Munger() 함수가 본질적으로 재귀적이지 않다는 점을 사용자에게 명확히 알려주어 버그 발생을 예방하는 데 도움이 될 것입니다.
Trim Multiple() 함수를 기다리는 동안 words() 함수 와 concat items() 함수를 조합하여 사용할 수 있습니다.
str = "input1;;;input2;;;input3";
Show(concat items(Words(str, ";"), ";"))
@호기 좋은 아이디어 감사합니다. 이 방법이 제 while 루프보다 훨씬 간결하네요.