2011-03-11 8 views
0

2 가지 시나리오에서 작동하는 정규 표현식 루아 5.0이 나오지 않습니다.정규 표현식에 문제가 있습니다.

1) 발현 = "[^V]Core %d+:%s*%+(%d+%.%d+)°C %(crit = %+(%d+%.%d+)°C%)" 이 올바르게 문자열과 일치 :

Core 0:  +45.0°C (high = +86.0°C, crit = +100.0°C) 

그러나, 나는 할 수 있도록하려면 :

Core 0:  +45.0°C (crit = +100.0°C) 

2) 식을 = "[^V]Core %d+:%s*%+(%d+%.%d+)°C %(high = %+%d+%.%d+°C, crit = %+(%d+%.%d+)°C%)" 이 제대로이 문자열을 일치 문자열과 일치하고 두 개의 캡처가 있습니다 : 첫 번째 온도와 임계 온도. (저는 고온이 필요 없습니다).

expression = "[^V]Core %d+:%s*%+(%d+%.%d+)°C %((?:high = %+%d+%.%d+°C,)crit = %+(%d+%.%d+)°C%)" 

내가 루아에서 오전하지만 난 정규식 표현식 구문이 밀접한 Perl과 같은 다른 언어를 일치 생각 : 나는이하지만 행운을 시도했다. 누구나 아이디어가 있으십니까?

+2

은 정말 온도가 내가 잘라 내가 괄호 전에 2 공백이 생각 때문에 붙여하지 않았다 – AndersH

답변

1

루아 문자열 patterns하지정규 표현식 있습니다.

원하는대로하려면 - 두 개의 다른 문자열을 일치 시키려면 실제로 두 개의 일치 항목을 시도해야합니다.

local input = ... -- the input string 
-- try the first pattern 
local temp, crit = string.match(input, "[^V]Core %d+:%s*%+(%d+%.%d+)°C %(crit = %+(%d+%.%d+)°C%)" 
-- if it didn't match, try the second match 
if not temp then 
    temp, crit = string.match(input, "[^V]Core %d+:%s*%+(%d+%.%d+)°C %(high = %+%d+%.%d+°C, crit = %+(%d+%.%d+)°C%)") 
end 
if temp then 
    -- one of the two matches are saved in temp and crit 
    -- do something useful here 
end 
0

(?:...) 그룹 뒤에 ?이 필요하다고 생각합니다.

괄호 앞의 공백 수와 함께 재미있는 일이 있습니다. 문자열과 작동하지 않는 regexp에는 2 개가 있지만 '정규식'정규식에는 하나가 있습니다. 견고성을 위해 % s +를 사용합니다.

+0

:-) 부정적인 결코 바랍니다. 그러나 % s +를 사용하는 것이 옳습니다. 또한 나는 시도 했습니까? 운이없는 (? : ...) 그룹 이후. –

+1

좋아요, 이제 실제로 LUA의 패턴 문서를 찾았습니다. 그들은 원래의 UNIX 정규 표현식의 힘조차 가지고 있지 않습니다. 실제로 수학적 의미에서 정규 표현식을 다룰 수는 없습니다. 괄호에 한정 기호가 없으며 캡처에만 사용되며 멋진 Perl에는 사용할 수 없습니다. 선택적인 고온 부품을 정확히 일치시키지 말고 그냥 거기에 있으면'% (. * crit')를 넣어 건너 뛰십시오. – LHMathies

+0

그래서 정규 표현식이 아닌 패턴이라고합니다. –

관련 문제