2014-04-25 2 views
0

텍스트 문서를 구문 분석하고 일부 텍스트를 바꿉니다. "\"가없는 텍스트 줄은 발견되어 아무 문제가 없어 보입니다. 이 문자열 아래와 같이 나는이 펄Perl 검색 및 바꾸기 - 문제는 ""로 인해 발생합니다.

에서 수행 할 수있는 방법으로

:

문제입니다 슬래시 "\"를 포함
Path=S:\2014 March\Test Scenarios\load\2014 March 

. 나는 간단한 검색을 사용하여 코드의 라인을 교체하고

$nExit =~ s/$sMatchPattern/$sFullReplacementString/; 

내가 어떻게해야합니까?

답변

3

리터럴 문자열과 일치하는 것으로 판단되어 정규식 특수 문자를 이스케이프해야합니다.

당신은 그렇게 할 quotemeta 또는 이스케이프 코드 \Q ... \E를 사용할 수 있습니다

$nExit = s/\Q$sMatchPattern/$sFullReplacementString/; 

위의 변수 $sMatchPattern는 보간되지만, 정규 표현식을 컴파일하기 전에 다음 특수 문자는 이스케이프됩니다. 따라서 $sMatchPattern의 값은 리터럴 문자열처럼 취급됩니다.

1

당신이 ... 당신이 원하는 백 슬래시, 그와 같은 연산자 앞에 또 다른 백 슬래시를 넣어하는 것을 잊지 말아 교체 문자열이나 일치하는 문자열에 \를 갖고 싶어

$sFullReplacementString = "\\"; 

를 돌려 것 단일 문자열로 \

2

문자열이 입력되었거나 프로그램에 포함되어 있습니까? 이 백 슬래시 문자 없애 할 수있는 :

그런데
my $path = "S:/2014 March/Test Scenarios/load/2014 March"; 

, 그것은 파일 및 경로 이름에 공백이하지 않는 것이 좋습니다. 특정 상황에서는 다소 문제가 될 수 있습니다. 그들을 제거 할 수 없다면 이해할 수 있습니다. 당신이 봐야한다

두 가지 :

  1. 사용 quotemeta 문자열에 인용 특수 문자를 도움이 대체에서 사용하도록 할 수 있습니다. 문자열에 역 슬래시가 있어도 quotemeta이 문자열을 처리합니다.
  2. 일치 항목 및 대체 항목에 구분 기호로 /을 사용할 필요가 없습니다. 대신 다양한 다른 문자로 대체 할 수 있습니다.

이은 모두 동일합니다

$string =~ s($regex)($replace); 
$string =~ s[$regex][$replace]; # Not really recommended because `[...]` is a common regex 
$string =~ s{$regex}{$replace}; 

정규 표현식 따옴표와 같은 문자로 이들의 장점 :

$string =~ s/$regex/$replace/; 
$string =~ s#$regex#$replace#; 
$string =~ s|$regex|$replace|; 

또한 괄호, 대괄호 또는 중괄호를 사용할 수 있습니다 균형을 유지해야한다는 것입니다. 따라서 내가 가지고 있다면 :

my $string = "I have (parentheses) in my string"; 
my $regex = "(parentheses}"; 
my $replace = "{curly braces}"; 

$string = s($regex)($replace); 
print "$string\n"; # Still works. This will be "I have {curly braces} in my string" 

내 문자열에 이러한 유형의 문자가 포함되어 있어도 균형이 맞으면 모든 것이 계속 작동합니다. 당신을 위해

: 당신을 위해 일한다

my $Path = 'S:\2014 March\Test Scenarios\load\2014 March'; 
$nExit = quotemeta $string; #Quotes all meta characters... 
$nExit =~ s($sMatchPattern)($sFullReplacementString); 

.

관련 문제