2012-11-21 11 views
4

기본적으로 C#을 사용합니다. 거기에 내가 할 수있는 :문자열에서 문자 (또는 하위 문자열)를 자르는 방법은 무엇입니까?

string trimmed = str.Trim('\t'); 

문자열 str에서 표를 잘라 내고 trimmed에 결과를 반환 할 수 있습니다.

델파이 7에서 나는 단지 Trim이라는 것을 발견했습니다.

어떻게 동일한 기능을 수행 할 수 있습니까?

+0

당신이 정말로 당신은 문자열의 끝에서 "문자열"을 다듬을 의미합니까? 그건 System.String.Trim이 .Net에서하는 일이 아닙니다. 이 함수는 * 배열 * 문자를 받아 들인 다음 현재 문자열의 양쪽 끝에있는 모든 문자를 다듬습니다. 배열의 문자 순서는 부적합합니다. –

답변

5

이 절차의 종류가 사는 곳 :

function TrimChar(const Str: string; Ch: Char): string; 
var 
    S, E: integer; 
begin 
    S:=1; 
    while (S <= Length(Str)) and (Str[S]=Ch) do Inc(S); 
    E:=Length(Str); 
    while (E >= 1) and (Str[E]=Ch) do Dec(E); 
    SetString(Result, PChar(@Str[S]), E - S + 1); 
end; 
+0

나는 당신의 코드와 비슷한 것을하려고 노력했다. 하지만 당신이 더 잘 했어요. – horgh

+1

어색한 PChar 캐스팅을 사용하는 SetString보다는 Copy를 호출 할 수 있습니다. –

+0

@RobKennedy, 동의합니다. Copy는 더 멋지게 보입니다. 소스에서 서로 다른 어셈블리 체인을 사용하여 약간 다른 성능 결과로 끝나는 것이 흥미 롭습니다. – Maksee

1

당신은 StringReplace와를 사용할 수 있습니다

var 
    str:String; 
begin 
    str:='The_aLiEn'+Chr(VK_TAB)+'Delphi'; 

    ShowMessage(str); 

    str:=StringReplace(str, chr(VK_Tab), '', [rfReplaceAll]); 

    ShowMessage(str); 
end; 

이 주어진 문자열에서 모든 탭 문자를 생략합니다. 하지만 당신이 그것을 향상시킬 수 있습니다, 당신이 앞뒤로 탭을 누른 다음 Pos 기능을 사용할 수있는 제거하려는 경우.

편집 : 포스와 함께 할 방법을 묻는 의견에 대한 , 여기있다 :

var 
    str:String; 
    s, e: PChar; 
begin 
    str:=Chr(VK_TAB)+Chr(VK_TAB)+'The_aLiEn'+Chr(VK_TAB)+'Delphi'+Chr(VK_TAB)+Chr(VK_TAB); 

    s:=PChar(str); 

    while Pos(Chr(VK_TAB), s)=1 do inc(s); 
    e:=s; 
    inc(e, length(s)-1); 
    while Pos(Chr(VK_TAB), e)=1 do dec(e); 
    str:=Copy(s, 1, length(s)-length(e)+1); 

    ShowMessage(str); 
end; 

그것은 물론 Maksee의에 의해 같은 방법이며 좀 더 작업을 같이 할 그것은. 그러나 작업을 완료 할 시간이 충분하지 않고 포지이 가장 먼저 생각해 본 것이면 다음과 같이 수행 할 수 있습니다. 프로그래머 이고 이어야한다고 생각합니다. 그리고 Pos를 char로 비교하기위한 약간의 조정을 통해 최적화의 제약을 말하면, 이것은 Maksee의 코드보다 빠르게 실행됩니다. SUBSTR 검색 일반화

편집 :

function TrimStr(const Source, SubStr: String): String; 
var 
    s, e: PChar; 
    l: Integer; 
begin 
    s:=PChar(Source); 
    l:=Length(SubStr); 

    while Pos(SubStr, s)=1 do inc(s, l); 
    e:=s; 
    inc(e, length(s)-l); 
    while Pos(SubStr, e)=1 do dec(e, l); 
    Result:=Copy(s, 1, length(s)-length(e)+l); 
end; 
+1

내 질문을 읽어 보셨습니까? 문자열을 다듬을 필요가 있지만 그 안에있는 모든 탭을 바꿀 필요가 없습니다 – horgh

+0

편집을 추가하고 있습니다) –

+1

이 답변을 얻으려면 적어도 Pos 기능을 어떻게 생각하는지 설명하거나 설명해야합니다 이 작업을 위해 작동합니다. 그렇지 않으면 질문을 전혀 이해하지 못했던 것 같습니다. –

3

를 트림 기능을 수행 델파이에서 찾을보다 만들 때로는 쉽게 매개 변수를 사용하지 않지만 공백뿐만 아니라 다른 문자도 다듬을 수 있습니다. 여기에 코드 (XE2에서 System.SysUtils에서 나는이 변경되었습니다 생각하지 않는다)이다 :

function Trim(const S: string): string; 
var 
    I, L: Integer; 
begin 
    L := Length(S); 
    I := 1; 
    if (L > 0) and (S[I] > ' ') and (S[L] > ' ') then Exit(S); 
    while (I <= L) and (S[I] <= ' ') do Inc(I); 
    if I > L then Exit(''); 
    while S[L] <= ' ' do Dec(L); 
    Result := Copy(S, I, L - I + 1); 
end; 

그것은 탭, 캐리지 리턴과 라인 피드와 같은 모든 제어 문자를 제거하는 것 '보다 아무것도 트리밍 .

+0

@Konstantin - Tab은 공백입니다. –

+0

+1 : 뭐라 구요. 당신은 절대적으로 씁니다. – horgh

+0

@KonstantinVasilcov 코드는 D7부터 확실히 변경되지 않았습니다. https://code.google.com/p/sx-library/source/browse/trunk/ExtLib/Delphi7/SysUtils.pas?r=160#3970 – gordy

2

Delphi는 사용자가 원하는 기능을 제공하지 않습니다. 기본 제공 Trim 함수는 항상 입력 문자열의 양쪽 끝에서 동일한 문자 집합 (공백 및 제어 문자)을 자릅니다. 여기에 몇 가지 대답은 임의의 문자를 자르기위한 기본 기술을 보여줍니다. 보시다시피 복잡하지 않아도됩니다. 여기 내 버전은 다음과 같습니다.

function Trim(const s: string; c: Char): string; 
var 
    First, Last: Integer; 
begin 
    First := 1; 
    Last := Length(s); 
    while (First <= Last) and (s[First] = c) do 
    Inc(First); 
    while (First < Last) and (s[Last] = c) do 
    Dec(last); 
    Result := Copy(s, First, Last - First + 1); 
end; 

여러 문자를 자르려면 각 루프에서 두 번째 조건어를 변경하기 만하면됩니다. 여러 글자를 어떻게 표현할지에 따라 글자를 바꿀 수 있습니다. C#은 배열을 사용합니다. 모든 문자를 문자열에 넣거나 Delphi의 기본 세트 유형을 사용할 수도 있습니다.당신 때문에,이 세트에 맞게 너무 크다 의미 델파이 2009, Char의로 WideChar의 별칭이다

function CharInArray(c: Char; ar: array of Char): Boolean; 
var 
    i: Integer; 
begin 
    Result := True; 
    for i := Low(ar) to High(ar) do 
    if ar[i] = c then 
     exit; 
    Result := False; 
end; 
// CharInString is identical, except for the type of `ar`. 

리콜 :

function Trim(const s: string; const c: array of Char): string; 
// Replace `s[x] = c` with `CharInArray(s[x], c)`. 

function Trim(const s: string; const c: string): string; 
// Replace `s[x] = c` with `CharInString(s[x], s)`. 

function Trim(const s: string; const c: TSysCharSet): string; 
// Replace `s[x] = c` with `s[x] in c`. 

CharInArrayCharInString 기능을 쉽게 작성할 수 있습니다 입력이 항상 AnsiChar에 맞을 것이라는 보장이 없으면 세트 버전을 사용할 수 없습니다. 또한 s[x] in c 구문은 WideChar 인수에 경고를 생성하므로 CharInSet(s[x], c)을 대신 사용하려고합니다. (CharInArrayCharInString 달리, RTL이 필요 델파이 버전, 이미 CharInSet을 제공합니다.)

8

는 선택적 매개 변수로 숯불의 배열을 받아 문자열 도우미 TStringHelper.Trim 있습니다.

function Trim(const TrimChars: array of Char): string; overload; 

그래서, 당신은 당신의 예를 들어

trimmed := str.Trim([#09]); 

를 사용할 수 있습니다. #09은 탭 문자의 ASCII 코드입니다.

이 함수는 최소한 Delphi XE3 이후에 존재합니다.

희망이 있습니다.

+0

실제로 델파이 7 질문 태그 – horgh

+0

@horgh 오, 미안 해요. 그러나 질문의 ​​저자는이 함수의 소스를 가져와 Delphi 7 용으로 다시 작성할 수 있습니다. – vladon

0

제다이 JCL의 V2.7은 당신이 필요 이러한 유용한 기능을 제공합니다

function StrTrimCharLeft(const S: string; C: Char): string; function StrTrimCharsLeft(const S: string; const Chars: TCharValidator): string; overload; function StrTrimCharsLeft(const S: string; const Chars: array of Char): string; overload; function StrTrimCharRight(const S: string; C: Char): string; function StrTrimCharsRight(const S: string; const Chars: TCharValidator): string; overload; function StrTrimCharsRight(const S: string; const Chars: array of Char): string; overload; function StrTrimQuotes(const S: string): string;

관련 문제