2013-10-21 4 views
2

안녕하세요, TCL에서 초보자입니다. 코드, 메소드 등을 알려주세요. 예를 들어 문자열이 있습니다 (abcgfhdskls12345) HELLO (hikjkflklfk) (bkjopkjjkl) HI (kjkkjjuilpp)()를 공백으로 바꾸는 TCL 코드

난 그냥 (사이의 모든 것을 제거) 만 하이 인쇄 할 할

과 안녕

답변

3

당신은 사용할 수 있습니다 티클 regsub는 괄호 아무것도를 제거합니다 :

set x "(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)" 
regsub -all {\(.*?\)} $x {} x 
puts $x 

산출되는 :

$ tclsh foo.tcl 
HELLO HI 
+3

하면 아마도 '[^()] *'대신에 '*'로 여기에 사용한다; 형식이 잘못된 입력이있을 때 예측 가능한 동작이 더 많습니다. (음, RE 엔진의 비회원에게는 더 예측 가능합니다.) –

0

제 제안은 정규식을 기반으로 대체를 수행하는 regsub 명령을 사용하는 것입니다. 당신의 패턴이 소스 문자열에 두 번 이상 나타날 수 있으며 당신은 단지 첫 번째 제거하지 않기 때문에

set str {(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)} 
set result [ regsub -all {\(.*?\)} $str {} ] 

-all 옵션이 필요합니다 : 당신은 다음처럼 작성할 수 있습니다.

{...} 안에있는 텍스트가 패턴입니다. 대괄호 안에있는 내용과 일치 시키려면 \(...\) 부분을 사용하십시오. 대괄호는 정규 표현식 구문에서 특별한 의미가 있기 때문에 필요합니다.

괄호 안에 당신은 모든 문자가 0 번 이상 반복 일치 할, 그래서 당신은 이 모든 문자를 의미 .*?을 가지고 있고 *?는 제로 또는-이상의 비 욕심 반복 명령입니다.

0

또한 개폐 괄호에 문자열을 분할하고, 홀수 요소를 던질 수 :

set s "(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)" 
foreach {out in} [split $s "()"] {puts $out} 
 

HELLO 

HI 

0

이것은 또한 유일한 정규 표현식을 사용하는 방법입니다.

set p {(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)} 
set pol [regexp {(.*)(HELLO)(.*) (.*)(HI)(.*)} $p p1 p2 p3 p4 p5 p6] 
puts "$p3 $p6" 

O/P :.? HI HELLO

관련 문제