2012-08-16 4 views
1

나는 다음과 같은 패턴 일치를 찾기 위해 노력하고 xxxx abc(xxxx):efg(xxxx):xyz(xxxx) - [0-9] 숫자TCL 정규 표현식 패턴 검색

내가

set string "my string is abc(xxxx):efg(xxxx):xyz(xxxx)" 
regexp abc(....):efg(....):xyz(....) $string result_str 

가 0이 누군가가 도와 드릴까요 반환을 사용?

답변

2

()은 캡처 하위 RE를 나타내는 점에서 Tcl 및 기타 많은 RE 엔진에서 정규 표현식과 특별한 의미가 있습니다. 문자를 "보통"으로 만들려면 백 슬래시로 이스케이프해야합니다. 즉, 백 슬래시가 일반 Tcl 메타 문자이므로 정규 표현식을 중괄호에 넣는 것이 가장 좋습니다. 따라서

: 그 .... 시퀀스는 항상 정확히 일치

regexp {abc\((....)\):efg\((....)\):xyz\((....)\)} $string \ 
     all abc_bit efg_bit xyz_bit 

참고 :

% set string "my string is abc(xxxx):efg(xxxx):xyz(xxxx)" 
% regexp {abc\(....\):efg\(....\):xyz\(....\)} $string 
1 

당신은 또한 그 괄호의 내용을 캡처 하려는 경우, 당신은 약간 더 복잡한 RE 필요 네 글자이지만 좀 더 구체적 인 것이 좋습니다. 각각의 경우에 숫자의 수를 일치 시키려면 :

regexp {abc\((\d+)\):efg\((\d+)\):xyz\((\d+)\)} $string -> abc efg xyz 

문자열의 비트를 추출하는 regexp를 사용하여, 그것은 전체 문자열 일치를위한 (오히려 이상한) 변수 이름으로 ->을 사용하는 것이 매우 일반적입니다; 그것은 "이 변수들에 추출 된 조각들을 보내라"는 것과 같이 약식으로 보입니다.

+0

그리고 대화식으로 테스트 할 때'regexp -inline'은 일치 여부를 찾는 대신 모든 일치하는 부분 문자열의 목록을 반환하기 때문에 좋습니다. –

+0

Donal와 다른 사람들에게 귀중한 제안을 해주셔서 감사합니다. 감사합니다. – pcbnagaraj

0

tcl에서는 작동하지 않지만 ()을 탈출해야합니다. x이 자릿수라고 확신하는 경우 .... 대신 \d{4}을 사용하십시오. 이것을 바탕으로 시도 할 수있는 업데이트 된 정규식은

abc\(\d{4}\):efg\(\d{4}\):xyz\(\d{4}\)입니다.

+0

이것은 실패합니다. 문자열 abc (12)로 시도하면 : efg (78) regexp abc (..) : efg (..) 작동합니다. 4 자리 숫자로 인해 발생한 문제에 대해 잘 모릅니다. – pcbnagaraj

+0

죄송합니다, 귀하의 질문에'xxxx'가 정확히 4 자리를 의미한다고 생각했습니다. 임의의 숫자가 될 수 있다면 정규 표현식에서'\ d {4}'를'\ d +'로 대체하십시오. – mtariq

+0

당신의 코멘트에있는 예제를 기반으로하면'abc (xxx)'는 여러 번 반복 될 수 있습니다 (질문에'abc ... efg ... xyz ... '를 사용했습니다). 좀 더 명확히 해 주시면 필요한 경우 답변을 업데이트 할 수 있습니까? – mtariq