2012-06-15 2 views
0

필자는 perl을 처음 접했고 문자열의 특정 부분과 일치하는 문제가 있습니다.Perl Regex Matching

내가 일치 노력하고있어 굵게 표시되어 있습니다 :

[1339300800] 현재 호스트 상태 : 뭔가;

대괄호 사이의 문자열을 성공적으로 일치시킬 수있었습니다.

($line=~/\[(\d*)\]*/) 
나는 굵은 글씨 부분에 대한이 같은 노력하고

:

($line=~/STATE:\s(\S+);/) 

사람이 몇 가지 조언을 주실 수 있습니까?

STATE:\s([^;]*); 

+0

[작품을 나를 위해.] (HTTP ://codepad.org/qri8rW48) 실제 문제는 무엇입니까? – daxim

+1

당신이 얻고있는 해답은 그 문제가 무엇인지 짐작한 사람들이 있습니다. 자신의 솔루션은'Something'을 포함하는'$ 1'과 정규 표현식으로 일치합니다. 너 한테 무슨 잘못이야? – Borodin

+0

$ 1은 'Something'을 인쇄하지 않습니다. – jackie

답변

2

귀하의 정규식 나를 위해 작동 않습니다. 이 1

if ($subject =~ m/STATE:\s(\S+);/) { 
    $result = $1; 
} else { 
    $result = ""; 
} 

또한 그룹에 일치하는 것을 기억, 첫 번째 정규 표현식을 만들 수 있습니다 덜 장황 조금

\[(\d*)] 
+0

"something"에 공백이 포함되어 있어도 작동하지 않습니다. – Cfreak

+0

그렇다면 귀하의 솔루션을 고려하십시오. delimeter가 좋기 때문입니다. – buckley

1

당신이 가까이있어 :

$line =~ /STATE:\s+([^;]+);/ 

하는 모든 것을 얻을 것이다 그것은 세미콜론이 아닙니다. 또한 여전히 주와 "뭔가"

2

문은 항상 ;로 끝나면 사이에 하나 개 이상의 공간이 있는지 일치합니다, 당신은 쓸 수 있습니다 :

$line =~ /:\s([^;]+)/ 
+0

이것이 실제로 효과가있는 것입니다. 왜 모든 사람이 내 코드가 괜찮다고 말하고 있는지 확신 할 수는 없지만 이상하게 작동하도록 couldnt합니다. 이 솔루션을 이용해 주셔서 감사합니다. – jackie

+0

@ JackieAldama 모두는 "무언가"로 테스트를하고 있었지만 일단 문자열에 공백이 있으면 "정규식이 깨질" – buckley

+1

결국 좋은 대답이되어야합니다. 그래서 +1해야합니다. 그러나'/ : \ s + ([^;] +) /'는 아마 더 안전합니다. 또는'/ : \ s + ([^;] +?) \ s *; /'. – Borodin