2012-01-27 3 views
0

나는 나의 IDE에 펄 REGEX 구문 분석 엔진을 사용하여 코드 을 통해 분석 그리고 난특정 문자열 패턴을 찾고 그와 일치하지 않는 것을 제거하려면 어떤 REGEX 패턴을 사용해야합니까? ...

$hash->{ hash_key04} 

처럼 모든 변수를 잡고 코드의 나머지 부분을 핵무기 할

지금까지 나의 아주 기본적인 REGEX 나던 내가

내가 ($ 1, $ 2 등), 그러나 일치 (. *) 전 대상 문자열 나던 후이를 위해 대체 사용할 알고
(.*)(\$hash\-\>\{[\w\s]+\})(.*) 


(
\$ 
hash 
\-\> 
\{ 
    [\w\s]+ 
\} 
) 

모든 캡처하는 것 무엇을 기대 할 나머지는 그가 코드!

UPADTED : null로 일치하는 항목을 시도했지만 너무 욕심이 많습니다.

([^\0]*) 

정규식의 어떤 표현식을 사용하여 문자열 패턴 만보고 나머지는 제거해야합니까?

IDE에서 바꾸기가 실행 된 후 문제가 $ hash -> {} 문자열 목록에 남기를 원합니다.

+1

단일/복수 줄 일치를 위해/s 또는/m을 추가 할 것을 고려하십시오. 또한 0-p 대신 0-9를 의미합니까? – mrk

+0

감사합니다 @ mrk, 문제는 내 정규 표현식이 잘못되었습니다. 내가 필요한 것을 어떻게 만드는지 잘 모르겠다. 거기에는 다른 $ vars와 {and} 및 ->가 포착되어서는 안되기 때문에 $ hash -> {(. *)} 만 일치해야합니다. – qodeninja

+1

중괄호 안에 중첩 된 중괄호가 포함될 수 있다면 불규칙한 표현 영역으로 들어가므로 [텍스트 :: 균형 잡기] (http://search.cpan.org/perldoc?Text :: 균형) – mob

답변

2

다른 방향에서 더 잘 접근 할 수 있습니다. 원하지 않는 것을 모두 삭제하는 대신, 원하는 모든 것을 추출하는 것은 어떨까요?정규식 부셔

my @vars = $src_text =~ /(\$hash->\{[\w\s]+\})/g; 

:

s/(\$hash->\{[\w\s]+\})|./$1/gs; 

이 정규식이 해시 중 하나와 일치하려고 : 여기

 
    /(     # start of capture group 
     \$hash->   # prefix string with $ escaped 
     \{    # opening escaped delimiter 
     [\w\s]+   # any word characters or space 
     \}    # closing escaped delimiter 
    )/g;    # match repeatedly returning a list of captures 

더 나은 당신의 IDE에 맞지 수있는 또 다른 방법입니다 각 위치에서 변수를 검색하고 실패하면 다음 문자를 삭제 한 다음 다시 시도합니다. 르 파일은 원하지 않는 모든 것을 삭제할 것입니다.

+0

좋습니다! 하나의 문제를 제외하고. Perl 정규 표현식을 사용하는 동안 Perl 코드를 사용하지 않지만 IDE 내부의 대치 함수입니다. 미안하지만, 그 점을 반영하도록 제 질문을 업데이트했습니다. – qodeninja

+0

아, 제한된 정규식 엔진의 재미 ... 반면에 대부분의 IDE는 선택 또는 전체 파일을 가져 와서 외부 프로그램 (이 경우에는 perl)을 통해 전달한 다음 결과를 제공하는 매크로 설정을 지원합니다 다시 파일로. 이런 식으로 설치해 줄 수 있니? –

+0

OMG가 작동했습니다! 너는 내 양말을 흔들어! 매우 느리고 clunky하지만 그것은 그것을했고 나에게 vars 사이에 줄 바꿈을 잔뜩 남겼습니다! – qodeninja

0

플랫폼에 따라 다르지만 일반적으로 패턴을 빈 문자열로 바꿉니다. C#을

Console.WriteLine(Regex.Replace("the latest in testing", "test", "")); 

0

에서 bash는

$ echo 'the latest in testing' | sed 's/test//g' 
the la in ing 

에서 자바 스크립트에서

,

// prints "the la in ing" 
console.log('the latest in testing'.replace(/test/g, '')); 

은 코딩 언어에 따라 다릅니다. 원하는 것은 그룹 2 (괄호 안의 두 번째 문자 집합)입니다. VIM에서 $ 2가 될 펄에서 ...

+0

죄송합니다. 전체 정보로 질문을 업데이트했습니다. Perl을 사용하면 표현에 도움이 필요합니다. – qodeninja

+0

정규식을 호출 한 후 $ 2의 변수는 원하는 것을 가져야합니다. – RussS

0

기본적으로 와일드 카드 .은 개행과 일치하지 않습니다. 사용하는 정규 표현식의 표준과 언어/api에 따라 플래그를 사용하여 일치하는 세트에서 개행을 활성화 할 수 있습니다. 또는 당신은 문자 집합을 정의하여 명시 적으로 자신을 추가 할 수 있습니다 :

[.\n\r]* <- Matches any character including newline, carriage return. 

이 코드에서 원하는 변수를 잡아 더 캡처 그룹을 포함하지 않는 행을 건너 뛸 캡처 그룹과이 결합.

컨텍스트에 맞는 정규식을 만드는 데 도움이 필요하면 입력 텍스트를 붙여넣고 출력 내용을 지정해야합니다.

0

당신이 정규식 s/^의 시작 부분에 ^를 추가하고 싶다고 생각합니다. (패턴) (.) $/$ 1 /이므로 줄 시작 부분에서 시작하여 끝까지 이동하여 해당 패턴을 제외한 모든 부분을 제거합니다.

관련 문제