2014-07-15 5 views
0

나는 여러 개의 물결표 (~)가 포함될 텍스트 줄이 있습니다. 이 시나리오에서는 보고서 인 일련의 데이터로 작업하고 있습니다. 각 물결표는 줄 바꿈/캐리지 리턴을 나타냅니다. 내가해야 할 일은 하나의 물결표 만 일치시키는 것입니다 (그래서 나는 그것들을 공백으로 바꿀 수 있습니다). 여러 개의 물결표 그룹을 그대로두고 싶습니다. 여러개의 물결표 그룹을 일치시킬 수 있습니다 (~{2,} 사용). 그러나 기본적으로 그 반대를 일치시켜야합니다.한정자 일치 1 이하

결과를 : ~~ 혈관 : 하대 정맥 ~~~ ~ ~~~~~~~~~~~~ 및 포털 정맥 여기

텍스트의 샘플 내가 수정하려고하고 있습니다 나타나는 숫자는 입니다. 대 동맥은 ~ 동맥류가없는 ~ ~ 구경 정상입니다.

이 예에서는 다른 물결표 그룹에 속하지 않은 3 개의 물결표를 모두 일치 시키려고합니다. "실제"데이터에는 문자열의 처음과/또는 마지막에 어떤 문자가 포함될 가능성이 있으므로 전체적으로 틸데가 많이 포함됩니다. 공백이나 문자로 둘러싸여있을 수 있습니다.

도움을 주셔서 감사합니다.

답변

2
set new [regsub -all {(^|[^~])~([^~]|$)} $str {\1 \2}] 

지금은 약간의 시간을 가지고, 일부 단어.

물결표가없고 물결표가 뒤에 오는 물결 표시가 있습니다. 우리는 이것을 시도 할 수 있습니다 : 정확히 이것을하는 {[^~]~[^~]}. 그러나 그 표현식은 실제로 앞뒤에 문자가 있어야합니다. 우리가 찾고있는 단일 물결표가 줄의 처음이나 끝에서 발생한다면 어떻게해야할까요? 그래서, 우리가 원하는 :

  • 에 의해
  • 비 ~ 문자 또는 문자열 ([^~]|$)의 말 뒤에 물결을 따라

    • 문자열 또는 비 ~ 문자 (^|[^~])의 시작.

  • 우리는 전에 우리가 공간으로 전환하고있는 물결 이후에 발생한 문자를 기억하는 괄호를 캡처 사용해야하므로 대체 문자열은, == 괄호의 첫 번째 세트에 의해 캡처 된 문자 {\1 \2}입니다 공백, 두 번째 괄호 세트에 의해 캡쳐 된 문자.

    우리 Tcl 사용자는 우리가 가지고있는 행운의 엔진을 가지고 있습니다. 그것은 매우 performant하고 매우 feature-full 다.

    +3

    질문에 대답 할 수도 있지만 답변을 설명하는 데 도움이되는 설명 텍스트를 추가 할 수 있습니까? –

    +0

    나는 동의한다. 이 코드를 사용하여 수행중인 작업에 대한 설명과 원래의 문제점을 해결하는 이유 및 방법을 설명하는 것은 좋은 양식입니다. Stack Overflow가 초보자로 가득하다는 것을 잊지 마십시오. 그들은 전문 지식에서 한두 가지를 배울 수 있습니다. –

    +0

    @TarynEast : "스택 오버플로는 적어도 정규 표현식 튜토리얼을 읽고 포럼에서 질문하기 전에 검색하는 데 필요한 초보자로 채워집니다. 나는 어려운 것을 보지 못하거나이 대답에서 설명 될 필요가있다. –

    0

    편집 : TCL이 lookbehinds를 허용하지 않는다는 것을 깨닫지 못했습니다. 글렌의 대답은 그것이 덮여있는 것 같습니다.

    시도해 볼 수 있습니다. 물결표가 앞뒤에 다른 물결표가 없는지 확인하기 위해 부정적인 lookbehind 및 lookahead를 사용합니다.

    (?<!~)~(?!~) 
    

    테스트 here.

    +0

    Nope. Tcl에는 lookbehind가 없습니다 (Tcl은 PCRE가 아닌 자체 regex 구현을 사용합니다) : http://tcl.tk/man/tcl8.5/TclCmd/re_syntax.htm –

    +0

    Thanks @CodyProbst! 제 질문에 대답 해 주셔서 감사합니다. 그것은 그 성가신 tcl 사업을 제외하고는 정확했습니다.;-) – Sophia