2017-10-25 1 views
-2

아래 예제에서 str1이 str2와 같으면 모든 경우를 무시하려고합니다. 즉 str1 eq str2입니다. 아래는 내가 직면 한 문제입니다.Perl이 문자열/부동 소수점 숫자에서 자르는 0을 제거합니다.

1 케이스 : STR1 = '{V1 0.85} STR2 ='{V1 0.850000}

case2 : STR1 = '{V1 0.65} {오프 V2} {V_3 1.1} STR2 = '{V1 0.650000} {오프 V2} {V_3 1.100000}

case3 : STR1 ='{V2 0.0} {V3 2.0} {V4 ON} STR2 = '{V2 0.0000000} {V3 2.000000} { V4 ON} '

위의 각 예제는 후행 0이 제거되면 str1 = str2 조건을 만족해야합니다 문자열.

현재이 내가 사용하고있는 정규식 :

$str2 =~ s/\.?0*}/\}/; 

하지만 일부 경우에 작동합니다. 예는 1 {에 0을 제거 위의 경우 2}하지만 2 세트

는 전에 즉 : str1이 '{v_0p65 0.65} {vout_off 오프} {v_1p1 1.1}'

후입니다 사용하는 정규식은 '{v_0p65 0.65} {vout_off 오프} {1.100000 v_1p1}'

코드는 다음과 같은 것입니다 (하나 개의 작은 조각을 붙여 너무 복잡) : str1과 str2와는 수신이 해시의 정확한 출력은 반복적으로 코드는 간단하게

입니다. 공간과} 끝에 (단지 소수점 앞에 0을 포함하지 않음) 소수점 앞에 선행 0 및 후행 0을 제거 사이의 영어
if ($str1 eq $str2) { 
#Don't do anything 
else { 
print ("str1 and str2 are not equal\n"); 
} 
+1

사용중인 실제 코드를 포함 할 수 있습니까? –

+0

위에 추가되었습니다. 여러 개의 입력 파일이 필요한 매우 복잡한 코드. 그러나이 부분과 정확히 똑같습니다. str2를 str1로 변환하는 정규식을 꽤 많이 필요합니다. – Rancho

+1

_actual_ 코드를 게시하지 않으면 _actual_ 솔루션을 제공 할 수 없습니다. 현재'if' 문 데모 코드는 $ str1이 $ str2와 같으면 순전히 매치 할 것이고 일치하지 않으면 아무것도하지 않을 것입니다. 어쨌든'better ($ str1 eq $ str2) {print ...; ' –

답변

2
s/ \K0*([0-9]+\.[0-9]+?)0*(?=})/$1/g; 

는 (직후에 0을 포함하지 않음 소수점).

/g은 동일한 문자열에서 가능한 한 여러 번 작동합니다. 귀하의 대체에도 다른 문제가 있었지만 귀하가 누락 된 핵심 부분 인 것으로 보입니다.

+0

정말 고마워요. 내가 찾고 있었던 것이 었습니다. 내 코드 s/([0-9] + \. [0-9] * [1-9] *?) 0 */$ 1/g ...에 사용했습니다. – Rancho

+0

'\ K'는'(? <=)'와 더 효율적입니다. 이전에 공간이 있는지 확인합니다. 선행 0을 제거 할 필요가 없다면'\ K0 *'을 생략 할 수 있습니다. – ysth

+0

'[0-9] *? '는'[0-9] * [1-9] *'(in 이 특별한 경우); '? '는 0 *의 끝에 0을 포함하는 것을 선호합니다. – ysth

관련 문제